تست امنیت بدون استفاده احراز هویت در MVC

دوشنبه 11 مرداد 1395

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

تست امنیت بدون استفاده احراز هویت در MVC

شاید شما در مورد استفاده از   ASP.NET Identity همراه با میان افزار OWIN authentication   و Membership Providerو ADFS و یا  Identity Server مردد هستید.

گزینه های زیادی برای این کار وجود دارد و برخی اوقات به همین دلیل (و همچنین به دلیل این که ایجاد امنیت کار دشواری است) تامین امنیت پروژه ها در انتهای پروژه و غالبا تحت فشار زمانی صورت می گیرد که این موضوع به هیچ وجه خوب نیست.

Signpost به همراه امکانات فراوان:

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

شما فقط باید یک   IPrincipal و IIdentity   ایجاد کنید و آن ها را در HttpContext تنظیم کنید. با وجود اینکه  لازم نیست که مکانیزم  احراز هویت را برای احراز هویت کاربرها انتخاب کنید، شما باید IPrincipal  و IIdentity   مورد نظر خودتان را اجرا کنید.

شما باید ClaimsPrincipal و ClaimsIdentity.  را بردارید.

دلیل این امر این است که اگر شما از احراز هویت بر پایه claim ها استفاده میکنید ، شما به هر کاربر یک claim نسبت میدهید. اگر شما درباره claim ها چیزی نمیدانید ( و شما از آن برای استفاده از نقش ها در برنامه خود استفاده کرده اید) این بهترین توضیحی است که می توان داد.

دلیل دیگر مربوط به نوع یک Claim می باشد(Claim نیز مانند سایر چیزها نوع و مقدار دارد) که اگر از آن استفاده کنید دقیقا مانند Role عمل خواهد کرد. (صفت Authorize نیز با این نقش همانند Role رفتار خواهد کرد.) با توجه به این توضیحات اگر شما یک Claim همراه با نوع آن به ClaimsIdentity اضافه کنید، دقیقا مشابه زمانی است که شما نقش های کاربری (Role) به صفحه اضافه کنید.

بنابراین اگر شما کاربرانی دارید که می خواهید پیکربندی امنیتی آن ها را بدون استفاده از مکانیزم های احراز هویت پیاده سازی کنید:

Proprertyهایی که می خواهید کاربر آن ها را داشته باشد را از ابتدای کار از طریق یک فایل پیکربندی بخوانید (web.config آسان ترین مکان برای انجام این عمل خواهد بود) .

رویداد Authenticate را در Global.asax مدیریت کنید. (این شیوه حتی زمانی که از Owin/Katana استفاده می کنید و یا پروژه بر روی IIS میزبانی می شود، نیز مفید خواهد بود و یا می توانید یک میان افزار Owin سفارشی ایجاد کنید).

در handler ، یک ClaimsPrincipal همراه با ClaimsIdentity ایجاد کنید و principal را بر روی HttpContext.Current.User تنظیم کنید.

اگر تصمیم دارید که اطلاعات کاربر را در web.config خودتان و در قالب ورودی های app settings نگهداری کنید، باید به شیوه زیر عمل کنید:

<appSettings>
        <add key="test-security" value="true"/>
        <add key="username" value="John Doe"/>
        <add key="roles" value="Manager Admin"/>
    </appSettings>

و Global asax شما باید به شکل زیر باشد:

public class MvcApplication : System.Web.HttpApplication
{
    public MvcApplication()
    {
        AuthenticateRequest += OnAuthenticateRequest;
    }

    private void OnAuthenticateRequest(object sender, System.EventArgs e)
    {
        if (ConfigurationManager.AppSettings["test-security"] != "true")
            return;

        var username = ConfigurationManager.AppSettings["username"];
        var roles = ConfigurationManager.AppSettings["roles"].Split(' ');

        ClaimsIdentity identity = new ClaimsIdentity(authenticationType: "test-security");
        identity.AddClaim(new Claim(ClaimTypes.Name, username));
        roles.ToList().ForEach(role => identity.AddClaim(new Claim(ClaimTypes.Role, role)));
        ClaimsPrincipal principal = new ClaimsPrincipal(identity);

        HttpContext.Current.User = principal;           
    }

Owin:

اگر در حال استفاده از Owin هستید به Global.asax نیاز نخواهید داشت. می توانید از یکی از extension method های IAppBuilder استفاده کنید که به شما اجازه می دهد یک میان افزار owin را در قالب یک lambda expression به برنامه اضافه کنید.

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            app.Use((owinContext, next) =>
            {
                if (ConfigurationManager.AppSettings["test-security"] != "true")
                    return next.Invoke();

                var username = ConfigurationManager.AppSettings["username"];
                var roles = ConfigurationManager.AppSettings["roles"].Split(' ');

                ClaimsIdentity identity = new ClaimsIdentity(authenticationType: "test-security");
                identity.AddClaim(new Claim(ClaimTypes.Name, username));
                roles.ToList().ForEach(role => identity.AddClaim(new Claim(ClaimTypes.Role, role)));
                ClaimsPrincipal principal = new ClaimsPrincipal(identity);

                //HttpContext.Current.User = principal; //this will work as well if you are hosting in IIS, 
                                                        //but if you are using owin, might as well use the owin 
                                                        //to set the principal

                owinContext.Authentication.User = principal;
                
                return next.Invoke();
            });

           //rest of your owin startup configuration
        }
    }

آموزش asp.net mvc

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

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

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

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