自定义身份validation和ASP.NET MVC
我有一个在ASP.NET 4
中构建的内部Web应用程序。 我们很难使用其他团队构建的身份validationAPI。 如果该站点的用户已成功通过该站点的身份validation,我希望他们可以访问整个站点。
在ASP.NET
WebForm时代,我只是习惯在会话中保留自定义User对象。 如果该对象为null,我知道用户未经过身份validation。 在MVC
是否有类似但改进的方法。 如果可能的话,我不想构建自己的ASP.NET Membership模型提供程序。 这样做最简单的方法是什么?
您可以将Forms Authentication
与Authorize
attibute结合使用,如下所示,
要限制对视图的访问:
将AuthorizeAttribute属性添加到操作方法声明中,如下所示,
[Authorize] public ActionResult Index() { return View(); }
在web.config中配置表单身份validation
登录发布操作:如果用户有效,则设置身份validationcookie
[HttpPost] public ActionResult Login(User model, string returnUrl) { //Validation code if (userValid) { FormsAuthentication.SetAuthCookie(username, false); } }
注销动作:
public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); }
您可能希望拥有自定义授权filter 。 这是一个例子: MVC中的自定义filter 。 然后,您可以在app start上全局应用此filter(使用RegisterGlobalFilters
)。
public class LegacyAuthorize : AuthorizeAttribute { public override void OnAuthorization(HttpActionContext actionContext) { if (HttpContext.Current.Session["User"] == null) base.HandleUnauthorizedRequest(actionContext); } }
然后在你的global.asax
你会有这样的东西:
GlobalFilters.Filters.Add(new LegacyAuthorize());
您可以尝试这样的事情:
FormsAuthentication.SetAuthCookie(username, rememberMe);
要为经过身份validation的用户设置cookie,然后只需使用Controller或需要身份validation的Action上的[Authorize]
属性。
尝试使用Google搜索该主题以获取更多信息,您将在MVC中找到许多有关身份validation和授权的内容。
您可以在MVC中执行的表单中执行的所有操作,只需在控制器登录操作中设置会话变量即可。
或者您可以这样做:在登录操作中添加formsauthentication.setauthcookie("username")
在此之后,使用[Authorize]关键字的任何操作都将允许当前用户进入。
您可以通过在登录成功时简单地放置会话变量值来执行会话身份validation。 例如
public ActionResult Index(Models.Login login) { if (ModelState.IsValid) { Dal.Login dLogin = new Dal.Login(); string result = dLogin.LoginUser(login); if (result == "Success") Session["AuthState"] = "Authenticated"; } return View(); }
现在的诀窍是,您应该拥有所有视图的公共布局页面,您必须检查它们的身份validation。 在这个布局页面中,只需像这样进行剃刀检查 –
@if (Session["AuthState"] != "Authenticated") { Response.Redirect("~/login"); } // other html
我一直在我的应用程序管理面板中使用此方法。