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

How can I redirect unauthorized users to a login page based upon the area?

我有一个 ASP.NET MVC5 网站,它将分为 public 和管理部分。

public 端有可选的身份验证,某些视图仅限于具有适当角色的经过身份验证的用户。如果用户试图在未经授权或没有适当角色的情况下访问 public 控制器,我希望他们被重定向到 "public" 登录页面。

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

[Authorize(Roles = "Organizer")]

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

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

您可以创建自定义授权属性,因此在 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...

        }
    }
}

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

var areaName = filterContext.RouteData.DataTokens["area"];