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 (Роли =" Менеджер, Администратор ")]'. – adam78

+0

Я думаю, вы можете использовать 'IOverrideFilter' и' OverrideAuthentication'. Обратите внимание, что в MVC6 вы можете использовать [Policy] (https://leastprivilege.com/2015/10/12/the-state-of-security-in-asp-net-5-and-mvc-6-authorization/) , – Tonio