2010-12-03 101 views
25

我正在嘗試使用ASP.NET MVC中的用戶和組對AD網站進行身份驗證。ASP .NET MVC使用Active Directory組授予表格授權

我已經把我所有的類以下的屬性(除賬戶類):

[Authorize (Roles="SubcontractDB Users")] 

該組下OU =區域 - > OU =組 - > OU =公司 - > CN =發現在活動目錄中的SubcontractDB。我假設我還需要安裝一個RoleManager中,我已經嘗試做的web.config中如下:

<roleManager defaultProvider="ADRoleProvider"> 
    <providers> 
    <clear /> 
     <add name="ADMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider" 
      connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" /> 
    </providers> 
</roleManager> 

我的連接字符串是:

<add name="ADConnectionString" 
     connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/> 

很顯然,我這樣做錯誤,因爲這不起作用。我想要做的就是允許訪問屬於AD中某個組的成員的用戶。

+0

是有什麼辦法可以防止在使用授權時被要求提供憑據?我在Intranet站點上使用Windows身份驗證,需要通過AD組進行安全保護,而不是提示用戶輸入憑據。 – Fireworks 2014-01-16 15:54:16

回答

29

所以我最終實現我自己授權的屬性和使用:

namespace Application.Filters 
{ 
    public class AuthorizeADAttribute : AuthorizeAttribute 
    { 
     public string Groups { get; set; } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      /* Return true immediately if the authorization is not 
      locked down to any particular AD group */ 
      if (String.IsNullOrEmpty(Groups)) 
       return true; 

      // Get the AD groups 
      var groups = Groups.Split(',').ToList<string>(); 

      // Verify that the user is in the given AD group (if any) 
      var context = new PrincipalContext(ContextType.Domain, "server"); 
      var userPrincipal = UserPrincipal.FindByIdentity(context, 
               IdentityType.SamAccountName, 
               httpContext.User.Identity.Name); 

      foreach (var group in groups) 
       if (userPrincipal.IsMemberOf(context, IdentityType.Name, group)) 
        return true; 
     } 
     return false; 
     } 
    } 
} 

,然後我可以簡單地使用下面的上述控制器或功能

Using Application.Filters; 
... 
[AuthorizeAD(Groups = "groupname")] 

注:你可以簡單地使用new PrincipalContext(ContextType.Domain);但是,.NET 4.0中存在一個錯誤,在userPrincpal.IsMemberOf(...)處出現(0x80005000)錯誤。有關詳細信息,請參閱here

如果你想知道如何重定向到基於授權失敗的另一頁,檢查我的答案在這裏:Adding an error message to the view model based on controller attribute in ASP.NET MVC

+0

我喜歡你在這裏所做的,除了你依靠一個簡單的cookie來緩存某人被授權的事實。什麼是阻止我手動添加authUserGroups cookie並繞過初始AD檢查? – Tr1stan 2011-05-20 09:42:12

+0

好點,刪除cookie部分。 – link664 2011-09-16 01:34:27

31

它不再需要實現自己的屬性,在ASP.NET MVC 3此功能。 AspNetWindowsTokenRoleProvider適用於Active Directory用戶和組。與AuthorizeAttribute使用這個你需要將以下添加到您的web.config:

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
    <providers> 
     <clear /> 
     <add 
      name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider" 
      applicationName="/" /> 
    </providers> 
</roleManager> 

然後,在你的控制器或動作方法,你可以參考Active Directory組,像這樣:

[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")]