2014-10-21 4 views
0

У меня есть контроллер с атрибутом Authorize. Я ожидал, что контроллер не будет создан в случае, если пользователь не авторизовался. Но похоже, что так оно и есть. Есть ли способ изменить это поведение и заставить Authorize генерировать ответ 401 без создания самого элемента управления?Авторизованный атрибут созданный контроллер для несанкционированных пользователей

Зачем мне это нужно? У меня есть некоторые контроллеры, ориентированные на администратора, которые предназначены только для аутентифицированных пользователей. Он имеет некоторую логику в конструкторе базового контроллера. В настоящее время я должен проверить, является ли Пользователь нулевым, что кажется пустой тратой.

ответ

0

Вы можете найти от AuthorizeAttribute и обрабатывать его так, как хотите. Запрос сначала ударит этот переопределенный метод, чтобы дать вам возможность решить, разрешить ли запрос обслуживаться дальше или отклонить его. Вы также можете проигнорировать какой-либо конкретный метод, например Login, добавив атрибут AllowAnonymous или определите свой собственный атрибут, исходя из класса Attribute.

рабочий пример ниже:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class RdbiAuthorizationAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// Verifies that the logged in user is a valid organization user. 
    /// </summary> 
    /// <param name="filterContext"></param> 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Guard.ArgumentNotNull(filterContext, "filterContext"); 
     Guard.ArgumentNotNull(filterContext.Controller, "filterContext.Controller"); 

     bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(
      typeof(AllowAnonymousAttribute), inherit: true) 
           || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
            typeof(AllowAnonymousAttribute), inherit: true); 

     if (skipAuthorization) 
     { 
      return; 
     } 

     if (string.IsNullOrEmpty(filterContext.HttpContext.User.Identity.Name)) 
      throw new AuthenticationException("User must be logged in to access this page."); 

     var controller = filterContext.Controller as BaseController; 
     if (controller != null) 
     { 
      var user = controller.GetUser(); 

      if (user == null) 
      { 
       throw new InvalidOperationException(string.Format("Logged in user {0} is not a valid user", filterContext.HttpContext.User.Identity.Name)); 
      } 
     } 

     base.OnAuthorization(filterContext); 
    } 
} 
+0

Если я правильно код вы предоставили, filterContext.Controller уже содержит экземпляр контроллера. Поэтому, что бы я ни писал внутри OnAuthorization, это не изменит тот факт, что контроллер уже создан. – SiberianGuy

+0

Я не понимаю, почему вас беспокоит, создан ли экземпляр контроллера или нет. Если вы обрабатываете запрос, вы можете вернуть соответствующий ответ (401) пользователю, и он не получит доступ к какому-либо ресурсу, на который у него нет прав. Я пропустил ваше требование? – SBirthare

Смежные вопросы