我有一个 ASP.NET MVC5 网站,它将分为公共(public)部分和管理部分。
公共(public)端有可选的身份验证,某些 View 仅限于具有适当角色的经过身份验证的用户。如果用户在未经授权或没有适当角色的情况下尝试访问公共(public) Controller ,我希望他们被重定向到“公共(public)”登录页面。
只需一个简单的属性即可按需要工作:[Authorize(Roles = "Organizer")]
但是,如果用户尝试访问管理区域中的任何内容,如果他们没有经过身份验证,或者经过身份验证但没有“管理员”角色,那么我希望他们被重定向到不同的登录屏幕。
( https://localhost:44300/Admin/Account/Login 而不是 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-mvc - 如何根据区域将未经授权的用户重定向到登录页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768193/