如何根据区域将未经授权的用户重定向到登录页面?
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"];
我有一个 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"];