1

ADAM/Azman を ASP.Net フォーム認証で動作させることができた人はいますか? デフォルトの ADAM ロール プロバイダーは、AD ドメイン ユーザーとのみ機能します。そして、私が読んだすべての記事は、そのためのカスタム ロール プロバイダーを作成する必要があると述べています。

また、あちこちでカスタム ロール プロバイダー コードの断片を見つけましたが、具体的なものは何もありませんでした。これに必要なロールプロバイダーを誰かが共有できれば、それは素晴らしいことです。

これまでに次の記事をフォローしました:

  1. カスタム ロール プロバイダー (機能しません) - http://www.codeproject.com/KB/aspnet/active_directory_roles.aspx
  2. 部分的なカスタム ロール プロバイダー コード - http://blogs.msdn.com/b/azman/archive/2006/05/06/591230.aspx
  3. 部分的なカスタム ロール プロバイダー コード - http://blog.avanadeadvisor.com/blogs/johanr/archive/2009/01/20/12373.aspx
  4. ADAM をセットアップし、ASP.Net (Windows 認証) で使用する MS 記事の手順
  5. 認証のための ADAM の開始 (ロールなし) - http://www.alexthissen.nl/blogs/main/archive/2007/07/26/getting-started-with-adam-and-asp-net-2-0 .aspx
4

1 に答える 1

2

私はハッキングされたバージョンを持っています、そして私は真剣にハッキングされたことを意味します。アプリでロールを変更する必要がないため、2つのメソッドのみを実装しました。ディレクトリを照会するには、ユーザー名とパスワードを送信する必要がありました。いつか、の接続文字列の使い方を知りたいのですActiveDirectoryMembershipProviderが、あまり時間をかけなかったので、簡単になりました。

 public class ActiveDirectoryFormsRoleProvider : RoleProvider
{
    public string DomainController { get; set; }
    public string ConnectionLDAPSuffix { get; set; }
    public string ConnectionUserName { get; set; }
    public string ConnectionPassword { get; set; }
    public override string ApplicationName { get; set; }

    public override bool IsUserInRole(string username, string roleName)
    {
        var roles = GetRolesForUser(username);
        return roles.Contains(roleName);
    }

    public override string[] GetRolesForUser(string username)
    {
        var results = new List<string>();
        using (var context = new PrincipalContext(ContextType.Domain, DomainController,ConnectionLDAPSuffix,ConnectionUserName,ConnectionPassword))
        {
            try
            {
                var p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);

                //looping twice because I was getting AppDomainUnloadedException on 50% of the first attempts
                for (var i = 0; i < 2; i++)
                {
                    try
                    {
                        var groups = p.GetAuthorizationGroups();
                        foreach (GroupPrincipal group in groups)
                        {
                            var name = group.SamAccountName;
                            if (!string.IsNullOrWhiteSpace(name))
                                results.Add(group.SamAccountName);
                        }
                        break;
                    }
                    catch (AppDomainUnloadedException)
                    {

                    }
                }
            }
            catch (Exception ex)
            {
                throw new ProviderException("Unable to query Active Directory.", ex);
            }
        }

        return results.ToArray();
    }

..。

実稼働サーバーで何らかの理由でGetAuthorizationGroups()、最初の試行がスローによって失敗した時間の50%が原因で、2回試行する必要がありAppDomainUnloadedExceptionます。forそのループを削除できる可能性があります。

そして、これが私のweb.config要素です。

<roleManager enabled="true" defaultProvider="ActiveDirectoryFormsRoleProvider">
      <providers>
        <clear />
       <add name="ActiveDirectoryFormsRoleProvider"
          type="myapp.ActiveDirectoryFormsRoleProvider" 
          applicationName="myapp"
          DomainController="domaincontroller.testdomain.corp"
          ConnectionLDAPSuffix="DC=testdomain,DC=corp"
          ConnectionUsername="username"
          ConnectionPassword="password"
        />
      </providers>
    </roleManager>
于 2011-09-01T22:17:13.077 に答える