是否有人能够使ADAM / Azman使用ASP.Net表单身份验证。默认的ADAM角色提供程序仅适用于AD域用户。我读过的每篇文章都说你需要为它编写自定义角色提供程序。
我也在这里和那里发现了一些自定义角色提供程序代码,但没有具体内容。如果有人可以共享此需要的角色提供者,那就太棒了。
到目前为止,我已经关注了以下文章:
答案 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>