2010-11-01 3 views
2

Я пытаюсь использовать свою собственную авторизацию, создав базовый контроллер и переопределив метод OnAuthorization.Пользовательская авторизация

Он работает нормально, когда авторизация завершается с ошибкой, но я получаю страницу 401, когда мои проверки успешны (но проверки авторизации по умолчанию не выполняются).

protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var roleAttribute = typeof(AuthorizeAttribute); 
     var attributes = filterContext.ActionDescriptor.GetCustomAttributes(roleAttribute, true); 
     if (attributes.Length == 0) 
      attributes = GetType().GetCustomAttributes(roleAttribute, true); 
     if (attributes.Length == 0) 
      return; 

     MvcHelper.Authenticate(); 


     foreach (AuthorizeAttribute item in attributes) 
     { 
      if (!Thread.CurrentPrincipal.IsInRole(item.Roles)) 
      { 
       filterContext.Result = new RedirectResult("~/Error/Unauthorized/" + "?MissingRole=" + item.Roles); 
       return; 
      } 
     } 

     //how do I prevent the default authorization here? 
    } 

Я попытался с filterContext.HttpContext.SkipAuthorization = true;, но это не помогает.

ответ

0

Я обычно делаю это в ActionFilter: https://gist.github.com/e297b435ceb8f022fb95

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext == null) 
     throw new ArgumentNullException("FilterContext"); 

    if (AuthProvider == null) 
     throw new ArgumentNullException("IAuthProvider"); 

    if (AuthProvider.Authenticate(filterContext) == false) 
    { 
     var req = filterContext.HttpContext.Request; 

     var response = filterContext.HttpContext.Response; 
     response.StatusCode = 401; 
     response.AddHeader("WWW-Authenticate", "Basic realm=\"Emergidata\""); 
     response.End(); 
    } 
    else 
    { 
     var controller = filterContext.Controller as IAppController; 
     controller.DynamicSession= AuthProvider.AuthProviderContext; 
    } 
} 
0

Я хотел бы сделать это в два этапа:

  • Во-первых, я бы обеспечить все приложение, так что вы явно должны белый список те контроллеры, которые должны быть доступны анонимным пользователям, см. раздел «Ограничение подхода фильтра LogonAuthorize» на странице http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx. Там у вас есть один фильтр, который вы применяете глобально, чтобы ограничить доступ к вашему приложению и один атрибут, который вы применяете к тем действиям, которые вы хотите разрешить анонимному доступу.
  • Следующим шагом будет внедрение другого фильтра, который вы применяете к тем действиям, в которых вы хотите, чтобы пользователь имел определенную роль или способность. Этот фильтр наследует от AuthorizeAttribute.
Смежные вопросы