Настройка авторизации в ASP.NET MVC
-
06-07-2019 - |
Вопрос
Класс моего контроллера украшен атрибутом AuthorizeAttribute для защиты действий:
[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
...
}
Каждый раз, когда вызывается действие, но пользователь не имеет хотя бы роли «Уровень пользователя 2», он автоматически перенаправляется на страницу входа с таким URL-адресом:
http://localhost:1436/Account/Login?ReturnUrl=%2fBuy
Если пользователь уже вошел в систему, но не имеет нужного уровня безопасности, это не оптимальное поведение!Было бы разумнее отображать страницу, информирующую пользователя об отсутствующем уровне, вместо отображения страницы входа в систему.
Что я могу сделать, чтобы настроить это поведение?Можно ли как-то передать необходимый уровень пользователя действию «Вход»?
Решение
Вы можете создать свой собственный атрибут авторизации следующим образом:
public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
Я использовал это для перенаправления на конкретный клуб на сайте членства в клубе, который я создаю.Вы можете адаптировать это к своим потребностям.Кстати, в моем случае я перенаправляюсь на страницу входа, но проверяю, авторизован ли пользователь, и если да, то показываю сообщение о том, что у него нет правильных разрешений.Без сомнения, вы также можете добавить что-то в ViewData или TempData для отображения на странице, но я этого не пробовал.
РЕДАКТИРОВАТЬAuthorizationContext.Cancel больше не существует в RC.«filterContext.Result is HttpUnauthorizedResult», кажется, достаточно: Что случилось с filterContext.Cancel (ASP.NET MVC)
Другие советы
Время давно прошло с момента последнего ответа.
С 2009 года в сфере авторизации был достигнут большой прогресс.В частности, OASIS (тех, кто стоит за SAML) стандартизировал XACML, расширяемый язык разметки контроля доступа.
XACML дает разработчикам:
- образец использования
- архитектура
- гибкий язык политики авторизации
XACML соответствует управлению доступом на основе атрибутов, которое NIST рекомендует использовать в современных приложениях.
Посмотри на это отвечать Больше подробностей.