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

دوشنبه 20 مهر 1394

در این مقاله پروژه ای از نوع mvc ایجاد میکنیم و درباره سطوح دسترسی و احراز هویت که به صورت پیش فرض در ویژوال قرار دارد استفاده میکنیم و مقداری ان را سفارشی میکنیم.

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

یک پروژه جدید Mvc ایجاد کنید.

همانطور که در عکس میبینید. پروژه را براساس الگوی Scaffolded ایجاد کردیم. به طور پیش فرض کنترل homeو کنترل حساب کاربری با بسیاری انواع احراز هویت و امنیت برای ما قرار میدهد. از امکانات کاربر ثبت نام ، ورود واحراز هویت با استفاده از فیس بوک،توییتر،G+ است. اما چگونه این اتفاق می افتد.در Mvc صفت[Authorize] کنترل سطح دسترسی به کاربر را مشخص میکند.

[Authorize]  
[InitializeSimpleMembership]  
public class AccountController : Controller  
{  
      [AllowAnonymous]  
    public ActionResult Login(string returnUrl)  
    {  
        ViewBag.ReturnUrl = returnUrl;  
        return View();  
    } 
}

در کد بالا میبینید که کنترلر دارای صفت[authorize] می باشد. این صفت  دسترسی به این کنترلر محدود شود.

namespace WebSecurityDemoTest.Filters  
{  
    public class WebSecurityAuthorize:AuthorizeAttribute  
    {  
        protected bool AuthorizeCore(HttpContextBase httpContext)  
        {  
            if (!httpContext.Request.IsAuthenticated)  
            {  
                return false;  
            }  
            if (HttpContext.Current.Session["SessionHelper"] == null)  
            {  
                return false;  
            }  
  
            return true;  
        }  
  
        protected void HandleUnauthorizedRequest(AuthorizationContext filterContext)  
        {  
            filterContext.Result = new RedirectResult("/");  
            base.HandleUnauthorizedRequest(filterContext);  
        }  
  
    }  
}  

همانطور که شما در اینجا میبینید من یک ویژگی Authorize  سفارشی ایجاد میکنم. که برای اولین بار چک میکند که ایا درخواست تصدیق دارد یانه.میخواهیم با FormAuthenticated این ISAuthenticate مقدار دهی شود بعد از لاگین

FormsAuthentication.SetAuthCookie(userName,true);

بعد از ورود موفق در وب سایت وقتی Authorize تنظیم می شود. isAuthorize برای اجرای درخواست true تنظیم می شود.

اما اگر true  نبود متد دیگری handel می شود.

در زیر کلاسی نوشته شده است که مسئول مقدار دهی اولیه جداول مورد نیاز توسط امنیت وب در پایگاه داده اجرا می شود.

using System;  
using System.Data.Entity;  
using System.Data.Entity.Infrastructure;  
using System.Threading;  
using System.Web.Mvc;  
using WebMatrix.WebData;  
using WebSecurityDemoTest.Models;  
  
namespace WebSecurityDemoTest.Filters  
{  
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]  
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute  
    {  
        private static SimpleMembershipInitializer _initializer;  
        private static object _initializerLock = new object();  
        private static bool _isInitialized;  
  
        public override void OnActionExecuting(ActionExecutingContext filterContext)  
        {  
            // Ensure ASP.NET Simple Membership is initialized only once per app start  
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);  
        }  
  
        private class SimpleMembershipInitializer  
        {  
            public SimpleMembershipInitializer()  
            {  
                Database.SetInitializer<UsersContext>(null);  
  
                try  
                {  
                    using (var context = new UsersContext())  
                    {  
                        if (!context.Database.Exists())  
                        {  
                            // Create the SimpleMembership database without Entity Framework migration schema  
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();  
                        }  
                    }  
  
                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);  
                }  
                catch (Exception ex)  
                {  
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);  
                }  
            }  
        }  
    }  
}  

IntializeSimpleMemberShipAttribute تضمین میکند که قبل از هر اقدامی اجرا شود.

FormsAuthentication.SetAuthCookie(userName,true);  

این کلاس مسئول مقدار دهی اولیه جداول مورد نیاز توسط امنیت وب سایت در پایگاه داده اجرا می شود.

using System;  
using System.Data.Entity;  
using System.Data.Entity.Infrastructure;  
using System.Threading;  
using System.Web.Mvc;  
using WebMatrix.WebData;  
using WebSecurityDemoTest.Models;  
  
namespace WebSecurityDemoTest.Filters  
{  
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]  
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute  
    {  
        private static SimpleMembershipInitializer _initializer;  
        private static object _initializerLock = new object();  
        private static bool _isInitialized;  
  
        public override void OnActionExecuting(ActionExecutingContext filterContext)  
        {  
            // Ensure ASP.NET Simple Membership is initialized only once per app start  
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);  
        }  
  
        private class SimpleMembershipInitializer  
        {  
            public SimpleMembershipInitializer()  
            {  
                Database.SetInitializer<UsersContext>(null);  
  
                try  
                {  
                    using (var context = new UsersContext())  
                    {  
                        if (!context.Database.Exists())  
                        {  
                            // Create the SimpleMembership database without Entity Framework migration schema  
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();  
                        }  
                    }  
  
                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);  
                }  
                catch (Exception ex)  
                {  
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);  
                }  
            }  
        }  
    }  
}  
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

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

سپس AdoEntitydataModel را انتخاب کنید

هنگامی که اتصال با موفقیت انجام می شود ما میتوانیم در web.config کانکشن استرینگ را ببینیم

ما نیاز به تغییر تنظیمات در رشته اتصال داریم

<add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=Customer;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> 

ابتدا برنامه را Build کنید  و سپس ان را اجرا نمایید.

بانک شما ساخته شده است.و اطلاعات کاربر را میتوانید در بانک مشاهده نمایید.

در سایت ثبت نام کنید و در جداول به اطلاعات خود نگاه کنید

 

فایل های ضمیمه

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

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

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

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