如何根据区域将未经授权的用户重定向到登录页面?

Beo*_*ett 2 authentication asp.net-mvc redirect asp.net-mvc-areas

我有一个ASP.NET MVC5网站,将分为公共和管理部分.

公共端具有可选身份验证,某些视图仅限于具有相应角色的经过身份验证的用户.如果用户在未经授权或没有相应角色的情况下尝试访问公共控制器,我希望将其重定向到"公共"登录页面.

只需一个简单的属性,它就可以正常工作:

[Authorize(Roles = "Organizer")]

但是,如果用户尝试访问管理区域中的任何内容,如果他们未经过身份验证,或者经过身份验证但没有"管理员"角色,那么我希望将他们重定向到其他登录屏幕.(https:// localhost:44300 /管理员/帐户/登录而不是https:// localhost:44300 /帐户/登录).

是否有一种简单的方法可以为整个区域应用备用登录重定向?

Sir*_*ifi 9

您可以创建自定义授权属性,因此HandleUnauthorizedRequest您可以根据区域名称将未经授权的用户重定向到特定的登录页面:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            var areaName = filterContext.RouteData.DataTokens["area"];
            if (areaName.Equals("Admin"))
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new {controller = "Account", action = "Login", area = "Admin"}));
            }
            else if(areaName.Equals("Public"))
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new { controller = "Account", action = "Login" }));
            }
           // other conditions...

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我们使用此代码获取当前区域名称:

var areaName = filterContext.RouteData.DataTokens["area"];
Run Code Online (Sandbox Code Playgroud)