ADAM和Azman与ASP.Net形成身份验证

时间:2011-08-23 22:10:51

标签: asp.net-membership adam azman

是否有人能够使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. MS文章设置ADAM并将其与ASP.Net(windows auth)一起使用的步骤
  5. 使用ADAM进行身份验证(无角色) - http://www.alexthissen.nl/blogs/main/archive/2007/07/26/getting-started-with-adam-and-asp-net-2-0.aspx

1 个答案:

答案 0 :(得分:1)

我有一个黑客攻击版本,我认真地指的是黑客入侵。我不需要在我的应用程序中修改角色,所以我只实现了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();
    }

...

由于某些原因,在我的生产服务器上,我必须进行2次GetAuthorizationGroups()次尝试,因为投掷AppDomainUnloadedException的第一次尝试失败的时间有50%。您可以删除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>