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