فیلتر احراز هویت در Asp.Net MVC

جمعه 22 آبان 1394

در این مقاله می خواهیم در مورد سفارشی سازی احراز هویت صحبت نماییم، هم چنین در مورد ویژگی های احراز هویت سفارشی در asp.net mvc صحبت نماییم.

فیلتر احراز هویت در Asp.Net MVC

mvc 5 شامل برخی از پیشرفت های بزرگ در احراز هویت است، این شامل فیلترهای تایید هویت جدید، گزینه ی تایید هویت جدید، و مدیریت هویت جدید است.

در این مقاله ما می خواهیم فیلترهای احراز هویت را ببینیم و اینکه چطور از آن ها استفاده می شود، قبل ها asp.net هر فیلتری را برای احراز هویت نمی توانست بسازد، اما الان یک چهارچوبی فراهم شده است که می تواند به راحتی یک فیلتر سفارشی احراز هویت بسازد.

اگر شما با asp.net mvc کار کرده باشید فیلتر های Authorization ،فیلتر هایی هستند که مجوز انجام کارهای مجوز دار برای یک کاربر تصدیق شده است.یک مثال خوب مجوز مبتنی بر نقش است.

در Asp.net mvc 4 از ویژگی AllowAnonymous استفاده شده است، این ویژگی اجازه می دهد تا کاربران ناشناس به کنترل یا عملیات خاص دسترسی پیدا کنند.

به این ترتیب شما می توانید نام سایت را با استفاده از این ویژگی Authorize نمایید، allow anonymous اجازه می دهد تا کاربران نا شناس به عملیات و کنترل خاص بدون محافظت دسترسی پیدا نکنند.

می توانید برای درک بهتر allow anonymous  مقاله ی آن را مطالعه نمایید و بعد ادامه ی این مقاله را مطالعه فرمایید.

دلیل واقعی، پشت فیلتر تایید شده چیست؟

به عنوان مثال قبل از درخواست مسیرها ما از یک فیلتر مجوز به تغییر مسیر یک کاربر نیاز داریم مثلا شما login را در نظر بگیرید ، کاربر باید حتما ثبت نام کند وبعد login کند و بعد وارد سایت شود.

شما می توانید منطق احراز هویت را برای هر عمل ، هر control، در سطح global و یا logic اعمال نمایید.

فرض کنید سایت شما قابل اجرا بر روی فرم های مبتنی بر احراز هویت است با استفاده از کوکی ها، اما شما باید یک نیاز خاص برای پشتیبانی از کنترل خاص و یا عملیات ارائه دهید که احراز هویت مختلف آن شفاف باشد.

ساخت فیلتر هویت با استفاده از asp.net mvc

ویژوال خود را باز نمایید و یک پروژه ی جدید از نوع asp.net mvc 5 بسازید، به صورت زیر:

به منظور ایجاد یک فیلتر تایید شما باید IAuthenticationFilter را پیاده سازی نمایید. در زیر اجرای IAuthenticationFilter است:

public interface IAuthenticationFilter
{
    void OnAuthentication(AuthenticationContext filterContext);
    void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
}

شما هم چنین به ActionFilterAttribute   نیاز دارید ، این اجازه می دهد که شما فیلتر احراز هویت خود را بر حسب controller و یا action و یا یک فیلتر به صورت تعریف نمایید globaly

public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext filterContext)
    {            
    }
    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {            
    }
}

اگر شما در بالا ویژگی احراز هویت سفارشی را  نگاه کنید، دو روش جالب مورد نیاز برای اجرا وجود دارد.

OnAuthentication-1

OnAuthenticationChallenge-2

فراخوانی فیلتر احراز هویت با فراخوانی متد زیر است:

AuthenticationContext authenticationContext = InvokeAuthenticationFilters(controllerContext, filterInfo.AuthenticationFilters, actionDescriptor);

این روش باعث ایجاد یک AuthenticationContext و اجرای هرفیلتر در روش اعتبار سنجی به صورت زیر:

AuthenticationContext context = new AuthenticationContext(controllerContext, actionDescriptor, originalPrincipal);
foreach (IAuthenticationFilter filter in filters)
{
      filter.OnAuthentication(context);
}

AuthenticationContext این اطلاعات را برای انجام احراز هویت فراهم می کند، شما می توانید این اطلاعات را برای تصمیم گیری احراز هویت بر اساس چهارچوب فعلی استفاده نمایید.

IPrincipal newPrincipal = context.Principal;
if (newPrincipal != originalPrincipal)
{
      Contract.Assert(context.HttpContext != null);
      context.HttpContext.User = newPrincipal;
      Thread.CurrentPrincipal = newPrincipal;
}

:OnAuthenticationChallenge

روش بالا بعد از روش قبلی اجرا می شود، شما می توانید روش بالا را برای انجام کارهای اضافی به درخواست اضافه نمایید.

protected virtual AuthenticationChallengeContext InvokeAuthenticationFiltersChallenge(
ControllerContext controllerContext, IList filters,
ActionDescriptor actionDescriptor, ActionResult result)

نکته ی کلیدی این است که به یاد داشته باشید OnAuthenticationChallenge لزوما قبل از هر عمل دیگر فیلتر اجرا کنید، این می تواند در مراحل مختلف اجرا شود، به عنوان مثال می تواند بعد از فیلتر مجوز اجرا و یا در تکمیل اجرا کنید .

شما می توانید از روش OnAuthenticationChallenge به ایجاد تغییر در action result استفاده کنید.

filterContext.Result = new HttpUnauthorizedResult();

پیاده سازی و تنظیم فیلتر سفارشی Authentication

ما  از یک متد CustomAuthenticationAttribute استفاده می کنیم، ما OnAuthentication را می سازیم و پیاده سازی می کنیم ، ما می خواهیم تنطیم و اجرا کنیم فقط برای action HomeController’s

در OnAuthentication به یک مدیر سفارشی با برخی از خواص اضافی تنظیم می کنیم.

OnAuthenticationChallenge با این متد چک می کند که کاربر احراز هویت شده است یا نه؟

:CustomAuthenticationAttribute

public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext) {
    
    //For demo purpose only. In real life your custom principal might be retrieved via different source. i.e context/request etc.
    filterContext.Principal = new MyCustomPrincipal(filterContext.HttpContext.User.Identity, new []{"Admin"}, "Red");
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) {
    var color = ((MyCustomPrincipal) filterContext.HttpContext.User).HairColor;
    var user = filterContext.HttpContext.User;
    
    if (!user.Identity.IsAuthenticated)
    {
        filterContext.Result = new HttpUnauthorizedResult();
    }
}
}

در کد زیر CustomAuthenticationAttribute فقط برای HomeController’s action  اجرا می شود

این متد توانایی کنترل احراز هویت فقط برای عمل اول را دارد.

public class HomeController : Controller
{
    [CustomAuthentication]
    public ActionResult Index()
    {
        return View();
    }
}

OnAuthentication با پیاده ساز ی و اجرا کردن این متد ، دسترسی سفارشی

به غیر از صفحه ی اول ممکن نخواهد بود

کد زیر را مشاهد نمایید:

public ActionResult About()
{
    var color = ((MyCustomPrincipal)ControllerContext.HttpContext.User).HairColor;
    return View();
}

روش OnAuthenticationChallenge مجموعه ی actionresault را برای کاربران غیر مجاز است ، این باعث می شود کاربر تغییر مسیر دهد.و دوباره به صفحه ی login  برود.

شما احتمالا می دانید که controller در Asp.net mvc خود نیز یک Action filter است.

public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IAsyncManagerContainer
{ }

با مقدمه ای از IAuthenticationFilter شما می توانید controller خود را سفارشی نمایید.مانند شکل زیر:

public class HomeController : Controller
{
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        //custom authentication logic
    }
    protected override void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        //custom authentication challenge logic
    }
}

نتیجه ی آخر:

IAuthenticationFilter توانایی زیادی برای سفارشی احراز هویت در یک asp.net mvc در یک نرم افزار دارد، احراز هویت و مجوز فیلتر ها دو بخش جدا از هم هستند، OnAuthenticationChallenge متدی است که ارائه ی توسعه ی بیشتر احراز هویت در چهار چوب asp.net mvc را دارد.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید