امنیت و سفارشی کردن احراز هویت در MVC
دوشنبه 20 مهر 1394در این مقاله پروژه ای از نوع 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 کنید و سپس ان را اجرا نمایید.
بانک شما ساخته شده است.و اطلاعات کاربر را میتوانید در بانک مشاهده نمایید.
در سایت ثبت نام کنید و در جداول به اطلاعات خود نگاه کنید
- ASP.net MVC
- 2k بازدید
- 2 تشکر