0
我有一个ASP MVC 5应用程序,我注意到登录的用户仍然可以访问注册和登录页面。我还注意到,当登录用户尝试访问他们未被授权的控制器操作时,他们被重定向到登录页面。这很让人困惑,因为用户已经登录。ASP MVC 5登录用户仍然可以访问登录和注册页面?
如何解决这个问题,以便未经授权的重定向到其他401错误页面或视图。
我有一个ASP MVC 5应用程序,我注意到登录的用户仍然可以访问注册和登录页面。我还注意到,当登录用户尝试访问他们未被授权的控制器操作时,他们被重定向到登录页面。这很让人困惑,因为用户已经登录。ASP MVC 5登录用户仍然可以访问登录和注册页面?
如何解决这个问题,以便未经授权的重定向到其他401错误页面或视图。
在注册/登录页面,你可以重定向登录用户:
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Account");
}
// ...
}
如果您使用的角色,您可以覆盖AuthorizeAttribute
[AuthorizeRole(Roles="Admin")]
public ActionResult Admin()
{
//...
}
AuthorizeRoleAttribute.cs
编辑:重写HandleUnauthorizedRequest
public class AuthorizeRoleAttribute : AuthorizeAttribute
{
public override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated
// Check if user is in roles
&& Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
{
// Not in any role change view
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/UnauthorizedRole.cshtml"
};
}
else{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
因此,基本上没有办法覆盖现有的Authorize属性''[Authorize(Roles =“Manager,Admin”)]',以便它正常工作。你说的是我必须创建我自己的新授权属性,并使用它而不是现成的授权属性。 '[AuthorizeRole(Roles =“Manager,Admin”)]'。 – adam78
我认为你可以使用'IOverrideFilter'和'OverrideAuthentication'。请注意,在MVC6中,您可以使用[策略](https://leastprivilege.com/2015/10/12/the-state-of-security-in-asp-net-5-and-mvc-6-authorization/) 。 – Tonio