2010-01-26 63 views
4

我使用ASP.NET MVC 1.1與Windows身份驗證。我試圖只授權一個小組和我自己的成員。我不是該組的成員,也不需要成爲該組的成員。每次訪問Web應用程序的URL時,我都會收到windows登錄名/密碼提示。 HomeController有asp.net mvc [授權()]屬性爲混合組和用戶

[HandleError] 
[Authorize([email protected]"MyDomain\\company.security.group.name")] 
[Authorize([email protected]"MyDoamin\\MyName")] 
[OutputCache(Duration=86400,VaryByParam="PageIndex")] 
public class HomeController : Controller 

如何啓用此類授權?該Web應用程序正在IIS6上的一個站點下運行。該網站具有目錄安全性以接受匿名。 Web應用程序/虛擬目錄禁用了匿名功能並啓用了Windows集成安全性。 web.config有

回答

11

您可以通過子類型AuthorizeAttribute查看用戶角色。把我的頭(未經測試)的頂部:

using System; 
using System.Linq; 
using System.Security.Principal; 
using System.Web; 
using System.Web.Mvc; 

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    // This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method. 
    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     base.AuthorizeCore(httpContext); 

     if ((!string.IsNullOrEmpty(Users) && (_usersSplit.Length == 0)) || 
      (!string.IsNullOrEmpty(Roles) && (_rolesSplit.Length == 0))) 
     { 
      // wish base._usersSplit were protected instead of private... 
      InitializeSplits();     
     } 

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

     var userRequired = _usersSplit.Length > 0; 
     var userValid = userRequired 
      && _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase); 

     var roleRequired = _rolesSplit.Length > 0; 
     var roleValid = (roleRequired) 
      && _rolesSplit.Any(user.IsInRole); 

     var userOrRoleRequired = userRequired || roleRequired; 

     return (!userOrRoleRequired) || userValid || roleValid; 
    } 

    private string[] _rolesSplit = new string[0]; 
    private string[] _usersSplit = new string[0]; 

    private void InitializeSplits() 
    { 
     lock(this) 
     { 
      if ((_rolesSplit.Length == 0) || (_usersSplit.Length == 0)) 
      { 
       _rolesSplit = Roles.Split(','); 
       _usersSplit = Users.Split(','); 
      } 
     } 
    } 
} 
+0

發佈的自定義屬性代碼中缺少某些內容。我設法調試並編譯它。它沒有工作。這是屬性聲明。 [MyAuthorize(Roles = @「MyDomain \\ company.security.group.name」,Users = @「MyDoamin \\ MyName」))] – user266909

+0

您能詳細說明「沒有工作」嗎? –

+2

我知道這是一箇舊帖子,但你似乎錯過的是'@'消除了逃避反斜槓的必要。當你這樣做時,你創建一個包含兩個反斜槓的字符串文字,而不是你需要的單斜槓。 –

12

當你與你並不需要加倍轉義反斜線的「@」字符前綴您的域名/用戶和域/組串。你可以嘗試用兩種替換這些行:

[Authorize(Roles="MyDomain\\company.security.group.name")] 
[Authorize(Users="MyDoamin\\MyName")] 

[Authorize([email protected]"MyDomain\company.security.group.name")] 
[Authorize([email protected]"MyDoamin\MyName")] 

的進一步閱讀位也透露,授權過濾器將執行「用戶」和「角色」檢查。如果用戶不符合這兩個要求,那麼他們將被拒絕訪問。
要獲得您想要的行爲,您需要按照先前的答案中的建議編寫自定義授權過濾器。