0

我有一个ASP MVC 5应用程序,我注意到登录的用户仍然可以访问注册和登录页面。我还注意到,当登录用户尝试访问他们未被授权的控制器操作时,他们被重定向到登录页面。这很让人困惑,因为用户已经登录。ASP MVC 5登录用户仍然可以访问登录和注册页面?

如何解决这个问题,以便未经授权的重定向到其他401错误页面或视图。

回答

0

在注册/登录页面,你可以重定向登录用户:

// 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); 
     } 
    } 
} 
+0

因此,基本上没有办法覆盖现有的Authorize属性''[Authorize(Roles =“Manager,Admin”)]',以便它正常工作。你说的是我必须创建我自己的新授权属性,并使用它而不是现成的授权属性。 '[AuthorizeRole(Roles =“Manager,Admin”)]'。 – adam78

+0

我认为你可以使用'IOverrideFilter'和'OverrideAuthentication'。请注意,在MVC6中,您可以使用[策略](https://leastprivilege.com/2015/10/12/the-state-of-security-in-asp-net-5-and-mvc-6-authorization/) 。 – Tonio

相关问题