2012-08-15 64 views
0

這允許「frankl」訪問但阻止管理員。我做錯了什麼?MVC3 AuthorizeAttribute

[Authorize(Order=1,Roles = "Admin",Users="frankl")] 
public class AuthorizeBaseController_Admins_frank : Controller 
{ 

} 

這可能是簡單的,但我不認爲這兩者結合起來,當我嘗試將其添加到「的AllowMultiple」屬性產生一個錯誤的任何實例。

謝謝, 克里斯

回答

1

角色和用戶應專用。如果你想將它們結合起來,你可以寫一個自定義屬性授權:

public class MyAuthoirizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
     { 
      throw new ArgumentNullException("httpContext"); 
     } 
     var user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) 
     { 
      return false; 
     } 
     var usersSplit = SplitString(Users); 
     var rolesSplit = SplitString(Roles); 

     return 
      (usersSplit.Length > 0 && usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) || 
      (rolesSplit.Length > 0 && rolesSplit.Any(user.IsInRole)); 
    } 

    private string[] SplitString(string original) 
    { 
     if (string.IsNullOrEmpty(original)) 
     { 
      return new string[0]; 
     } 
     return (from piece in original.Split(',') 
       let trimmed = piece.Trim() 
       where !string.IsNullOrEmpty(trimmed) 
       select trimmed).ToArray(); 
    } 
} 

然後:

[MyAuthorize(Order = 1, Roles = "Admin", Users="frankl")] 
public class AuthorizeBaseController_Admins_frank : Controller 
{ 
    ...  
} 
+0

我同意達林,他們應分別單獨使用。我想爲報告創建一個小組/角色,並在公交車上班時發生「frankl」事件,但客戶沒有這樣看待。感謝您提供自定義屬性上的代碼。 – Chris 2012-08-15 14:55:50

0

不幸的是,AuthorizeAttribrute會讓你要麼指定有效的用戶或有效角色 - 不能同時使用。這是來自MVC 3源代碼的相關位。

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
    if (httpContext == null) { 
     throw new ArgumentNullException("httpContext"); 
    } 

    IPrincipal user = httpContext.User; 
    if (!user.Identity.IsAuthenticated) { 
     return false; 
    } 

    if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
     return false; 
    } 

    if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
     return false; 
    } 

    return true; 
} 

你要麼需要做「弗蘭克」管理員,或創建一個自定義授權attribrute

相關問題