2010-11-01 164 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

我将分两个步骤来完成此:

  • 首先,我会确保整个应用程序,以便明确必须白名单的控制器,应提供给匿名用户,请阅读http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx上的“限制LogonAuthorize过滤器方法”一节。您有一个全局应用的过滤器,用于限制对应用程序的访问,以及一个适用于您希望允许匿名访问的操作的属性。
  • 下一步是实施另一个过滤器,将其应用于您希望用户具有特定角色或能力的操作。此过滤器将继承AuthorizeAttribute