webdevqa.jp.net

ASP Active Directoryグループでの.NET MVCフォーム認証

ASP.NET MVCのユーザーとグループを使用して、Active Directoryに対して認証を試みています。

すべてのクラス(アカウントクラスを除く)に次の属性を設定しました。

[Authorize (Roles="SubcontractDB Users")]

このグループは、Active Directoryの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の特定のグループのメンバーであるユーザーにアクセスを許可するだけです。

26
dnatoli

したがって、私は自分の承認属性を実装し、それを使用することになりました。

_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 を参照してください。

失敗した承認に基づいて別のページにリダイレクトする方法を知りたい場合は、ここで私の答えを確認してください: ASP.NET MVCのコントローラー属性に基づいてビューモデルにエラーメッセージを追加

33
dnatoli

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")]
32
Nick Cecil