ASP .NET MVC使用Active Directory组进行表单授权

时间:2010-12-03 03:42:54

标签: .net asp.net-mvc active-directory

我正在尝试使用ASP.NET MVC中的用户和组对Active Directory进行身份验证。

我在我的所有课程上都设置了以下属性(帐号类除外):

[Authorize (Roles="SubcontractDB Users")]

此组位于OU = Area-> OU = Groups-> OU = Company-> CN =活动目录中的SubcontractDB下。我假设我还需要在web.config中设置一个RoleManager,我试图按如下方式进行:

<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中某个组成员的用户。

2 个答案:

答案 0 :(得分:33)

所以我最终实现了自己的authorize属性并使用了它:

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")]

NB:您可以简单地使用new PrincipalContext(ContextType.Domain);但是.NET 4.0中存在一个错误,会在(0x80005000)处引发userPrincpal.IsMemberOf(...)错误。有关详细信息,请参阅here

如果您想知道如何根据授权失败重定向到其他网页,请在此处查看我的答案:Adding an error message to the view model based on controller attribute in ASP.NET MVC

答案 1 :(得分:32)

不再需要在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")]