ASP.NET - перенаправление на страницу ошибки, если авторизация ролей завершается

17

Я использую MVC 3 с проверкой подлинности с помощью форм. На моем контроллере или методах я делаю следующее:

[Authorize (Roles = "developer")]

В этой ситуации я хочу проверить, вошел ли пользователь в систему, а если нет, верните их на страницу входа. Однако, если проверка IsInRole для этого пользователя возвращает false, я хочу, чтобы они переходили на другое представление, которое говорит что-то вроде «Не разрешено».

Каков наилучший способ сделать что-то подобное? Я надеялся избежать создания нового атрибута авторизации, поэтому мне не нужно было реорганизовывать каждый атрибут Authorize во всем моем приложении, но если это то, что требуется, я поеду на этот маршрут.

    
задан Brandon 16.09.2011 в 18:23
источник

2 ответа

40

Пользовательский атрибут авторизации, переопределяющий метод HandleUnauthorizedRequest , может выполните задание:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // The user is not authenticated
            base.HandleUnauthorizedRequest(filterContext);
        }
        else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
        {
            // The user is not in any of the listed roles => 
            // show the unauthorized view
            filterContext.Result = new ViewResult
            {
                ViewName = "~/Views/Shared/Unauthorized.cshtml"
            };
        }
        else
        { 
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

, а затем:

[MyAuthorize(Roles = "developer")]
public ActionResult Develop()
{
    ...
}
    
ответ дан Darin Dimitrov 16.09.2011 в 18:31
источник
1

Вы также можете сделать это с помощью специальной страницы ошибок для 401 кодов состояния.

См. этот вопрос для деталей реализации.

    
ответ дан TheCodeKing 17.09.2011 в 01:23
источник