Класс My Controller украшен AuthorizeAttribute для защиты действий:
[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
...
}
Каждый раз, когда вызывается действие, но пользователь не выполняет по крайней мере роль «Уровень пользователя 2», пользователь автоматически перенаправляется на страницу входа с таким URL-адресом:
http: // localhost: 1436 / Аккаунт / Войти? ReturnUrl =% 2fBuy
Если пользователь уже вошел в систему, но не имеет нужного уровня безопасности, это не оптимальное поведение! Было бы разумнее отобразить страницу, которая информирует пользователя об отсутствующем уровне, вместо отображения страницы входа.
Что я могу сделать, чтобы настроить это поведение?
Можно ли каким-то образом передать требуемый уровень пользователя в действие Login?





Вы можете создать свой собственный атрибут авторизации следующим образом:
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)
filterContext, похоже, не имеет члена Cancel. Мне не хватает некоторых методов расширения?
Прошло время с момента последнего ответа.
С 2009 года в области авторизации был достигнут большой прогресс. В частности, OASIS (те, что стоят за SAML) стандартизировали XACML, расширяемый язык разметки управления доступом.
XACML дает разработчикам:
XACML соответствует управлению доступом на основе атрибутов, которое NIST рекомендует применять в современных приложениях.
Взгляните на этот отвечать для получения более подробной информации.
Есть еще один ответ здесь