1. 程式人生 > >ASP.NET MVC使用Authorize過濾器驗證使用者登入

ASP.NET MVC使用Authorize過濾器驗證使用者登入

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);
        }
    }
}