Авторизовать текущего пользователя с помощью контроллера и имени действия в ASP.NET MVC 3

#asp.net-mvc #asp.net-mvc-3 #authorization

#asp.net-mvc #asp.net-mvc-3 #авторизация

Вопрос:

Мне нужно создать настраиваемую авторизацию в ASP.NET MVC 3. Внутри приложения авторизация определяется в 5 таблицах: пользователи, группы, группы пользователей, права, grouprights. Пользователь может принадлежать к нескольким группам, и каждое право также может быть присвоено нескольким группам. Каждому действию контроллера присваивается rightID.

Встроенная авторизация не может соответствовать этой настройке, поэтому я попытался создать настраиваемый атрибут AuthorizeAttribute. При переопределении AuthorizeCore я понял, что у меня нет доступа к имени контроллера и имени действия.

Могу ли я каким-либо образом попросить маршрутизатор проанализировать запрос.RawUrl внутри AuthorizeCore для получения контроллера и имени действия? Или есть другой способ сделать то, что я хочу?

Ответ №1:

 protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    var routeData = httpContext.Request.RequestContext.RouteData;
    var controller = routeData.GetRequiredString("controller");
    var action = routeData.GetRequiredString("action");
    ...
}
  

Комментарии:

1. Итак, у меня есть доступ к контроллеру и имени действия 🙂

Ответ №2:

Вы можете добиться этого с помощью фильтров действий, где у вас есть доступ ко всем HttpContex.

 public class MyAuthorizeAttribute : ActionFilterAttribute, IAuthorizationFilter
{

    #region Implementation of IAuthorizationFilter

    public void OnAuthorization(AuthorizationContext filterContext)
    {
              // ... implementation

              // filterContext.Controller is the controller
              // filterContext.RouteData is all the route data
  

Комментарии:

1. Я где-то читал, что мне не следует внедрять свой собственный фильтр авторизации из-за некоторой проблемы с кешем вывода. Не уверен, что это все еще проблема в MVC 3.

2. Авторизация OnAuthorization может быть кэширована / разделена между запросами и пользователями, поэтому это небезопасно. Вместо этого используйте AuthorizeCore.