asp.net mvc 同一个项目支持不同的登录页面

返回
Author Avatar
钢翼
2017-05-27
编程
171

一般来说一个mvc项目只有一个登录页面,通过web.config可以方便的进行配置。

<authentication mode="Forms">    
    <forms loginUrl="~/Account/Login" protection="All" path="/" timeout="30" cookieless="UseCookies" />    
</authentication>

但假设我们将用户前台系统和后台管理系统放到同一个mvc项目,只是通过区域(area)来划分时,显然两个系统需要不同的登录页面。  
这个时候,我们可以通过重写AuthorizeAttribute的方式来实现不同区域跳转不同的登录页面。  
首先我们需要新建一个自定义AuthorizeAttribute。代码如下,网上很多都是重写OnAuthorization,但是这样会导致[AllowAnonymous]失效,所以这里我们重写HandleUnauthorizedRequest。

    public class CustomAuthorization : AuthorizeAttribute
    {
        public string Url { get; set; }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.HttpContext.Response.Redirect(Url+ "?ReturnUrl="+ filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));
            }
        }
    }

然后再Controller或者Action添加上以下特性

[CustomAuthorization(Url = "/Area/Account/Login")]

这样我们就可以实现在同一个项目跳转不同的登录页面了。