ASP.NET MVC使用Authorize過濾器驗證使用者登入
阿新 • • 發佈:2018-11-28
ASP.NET MVC使用Authorize過濾器驗證使用者登入。Authorize過濾器首先執行在任何其它過濾器或動作方法之前,主要用來做登入驗證或者許可權驗證。
示例:使用Authorize過濾器實現簡單的使用者登入驗證。
1、建立登入控制器LoginController
/// <summary> /// 登入控制器 /// </summary> [AllowAnonymous] public class LoginController : Controller { /// <summary> /// 登入頁面 /// </summary> public ActionResult Index() { return View(); } /// <summary> /// 登入 /// </summary> [HttpPost] public ActionResult Login(string loginName, string loginPwd) { if (loginName == "admin" && loginPwd == "123456") { //登入成功 Session["LoginName"] = loginName; return RedirectToAction("Index", "Home"); } else { //登入失敗 return RedirectToAction("Index", "Login"); } } /// <summary> /// 登出 /// </summary> public ActionResult Logout() { Session.Abandon(); return RedirectToAction("Index", "Login"); } }
注意:在登入控制器LoginController上新增AllowAnonymous特性,該特性用於標記在授權期間要跳過AuthorizeAttribute的控制器和操作。
2、建立登入頁面
@{ ViewBag.Title = "登入頁面"; Layout = null; } <h2>登入頁面</h2> <form action='@Url.Action("Login","Login")' id="form1" method="post"> 使用者:<input type="text" name="loginName" /><br /> 密碼:<input type="password" name="loginPwd" /><br /> <input type="submit" value="登入"> </form>
效果圖:
3、建立主頁控制器LoginController
public class HomeController : Controller
{
public ActionResult Index()
{
//獲取當前登入使用者
string loginName = Session["LoginName"].ToString();
ViewBag.Message = "當前登入使用者:" + loginName;
return View();
}
}
4、建立主頁頁面
@{ ViewBag.Title = "Index"; Layout = null; } <h2>Index</h2> <h3>@ViewBag.Message</h3> <a href="@Url.Action("Logout","Login")">登出</a>
效果圖:
5、建立授權過濾器LoginAuthorizeAttribute類
建立Filter目錄,在該目錄下建立授權過濾器LoginAuthorizeAttribute類,繼承AuthorizeAttribute。
using System.Web.Mvc;
namespace MvcApp.Filter
{
/// <summary>
/// 授權過濾器
/// </summary>
public class LoginAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//判斷是否跳過授權過濾器
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
{
return;
}
//判斷登入情況
if (filterContext.HttpContext.Session["LoginName"] == null || filterContext.HttpContext.Session["LoginName"].ToString()=="")
{
//HttpContext.Current.Response.Write("認證不通過");
//HttpContext.Current.Response.End();
filterContext.Result = new RedirectResult("/Login/Index");
}
}
}
}
通常Authorize過濾器也是在全域性過濾器上面的,在App_Start目錄下的FilterConfig類的RegisterGlobalFilters方法中新增:
using System.Web;
using System.Web.Mvc;
using MvcApp.Filter;
namespace MvcApp
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//新增全域性授權過濾器
filters.Add(new LoginAuthorizeAttribute());
}
}
}
Global.asax下的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MvcApp
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}