Настройка авторизации в ASP.NET MVC
Класс My Controller украшен атрибутом AuthorizeAttribute для защиты действий:
[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
...
}
В любое время, когда действие вызывается, но пользователь не входит, по крайней мере, в роль "Пользовательский уровень 2", он автоматически перенаправляется на страницу входа с URL-адресом, подобным этому:
http://localhost:1436/Account/Login?ReturnUrl=%2fBuy
Если пользователь уже вошел в систему, но не имеет нужного уровня безопасности, это не оптимальное поведение! Было бы разумнее отображать страницу, которая информирует пользователя о недостающем уровне, а не показывает страницу входа.
Что я могу сделать, чтобы настроить это поведение?
Возможно ли каким-либо образом передать требуемый уровень пользователя в действие "Вход"?
Ответы
Ответ 1
Вы можете создать свой собственный атрибут authorize следующим образом:
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 - HttpUnauthorizedResult", кажется, достаточно: Что случилось с filterContext.Cancel(ASP.NET MVC)
Ответ 2
Время прошло с момента последнего ответа.
С 2009 года в пространстве авторизации достигнут значительный прогресс. В частности, OASIS (те, что стоят за SAML), стандартизировали XACML, расширяемый язык разметки контроля доступа.
XACML дает разработчикам:
- шаблон использования
- архитектура
- гибкий язык политики авторизации
XACML находится в соответствии с контролем доступа на основе атрибутов, который NIST рекомендует применять в приложениях в настоящее время.
Посмотрите на этот ответ для более подробной информации.