我遵循了Microsoft的ADAM Step by Step Guide,并在我的本地计算机上设置了ADAM实例。我正在尝试使用“Mary Baker”帐户进行身份验证,但每次我在下面的if (entry.Guid != null)
行中收到COM异常。该异常表明存在未知的用户名或密码错误。
但是,我可以使用ldp实用程序连接到ADAM并成功执行简单绑定 - 所以我知道用户名都存在,并且我有正确的密码。
此外,我已将用户的msDS-UserAccountDisabled属性设置为false,并将用户添加到Administrators和Readers角色。
有什么想法吗?
path = "LDAP://localhost:50000/O=Microsoft,c=US";
userId = "CN=Mary Baker,OU=ADAM users,";
password = "Mary@101";
DirectoryEntry entry = new DirectoryEntry(path, userId, password, AuthenticationTypes.None);
if (entry.Guid != null)
LoadWelcomeScreen();
感谢。
答案 0 :(得分:2)
ADAM将用户的唯一标识符存储在displayName
类的user
属性中。它们需要在ADAM实例中是唯一的,以供用户进行身份验证。如果两个用户的displayName
属性都设置为'jsmith',则两个用户都无法在ADAM中进行身份验证。
使用ldp实用程序查询Mary Baker的displayName
。它可能像'mbaker'。在给定代码中将该值用作userId。
答案 1 :(得分:1)
感谢Ryan对 displayName 的提示。将我的测试课程发布在我当地的ADAM实例上,供可能感兴趣的人使用。
[TestMethod]
public void CreateUserAccount()
{
var username = "amurray";
var password = "ADAMComplexPassword1234";
var firstname = "Andy";
var lastname = "Murray";
const AuthenticationTypes authTypes = AuthenticationTypes.Signing |
AuthenticationTypes.Sealing |
AuthenticationTypes.Secure;
var ldapPath = "LDAP://localhost:389/OU=MyProject,OU=Applications,DC=Company,DC=ADAM";
using (var dirEntry = new DirectoryEntry(ldapPath, "MyPC\\adamuser", "Password1!", authTypes))
{
DirectoryEntry user = null;
const int ADS_PORT = 389;
const long ADS_OPTION_PASSWORD_PORTNUMBER = 6;
const long ADS_OPTION_PASSWORD_METHOD = 7;
const int ADS_PASSWORD_ENCODE_CLEAR = 1;
try
{
user = dirEntry.Children.Add(string.Format("CN={0} {1}", firstname, lastname), "user");
user.Properties["displayName"].Value = username;
user.Properties["userPrincipalName"].Value = username;
user.Properties["msDS-UserAccountDisabled"].Value = false;
user.Properties["msDS-UserDontExpirePassword"].Value = true;
user.CommitChanges();
var userid = user.Guid.ToString();
// Set port number, method, and password.
user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_PORTNUMBER,ADS_PORT});
user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_METHOD,ADS_PASSWORD_ENCODE_CLEAR});
user.Invoke("SetPassword", new object[] {password});
user.CommitChanges();
user.Close();
}
catch (Exception e)
{
var msg = e.GetBaseException().Message;
Console.WriteLine(e);
System.Diagnostics.Debug.Print(msg);
}
}
}
[TestMethod]
public void TestUserAuthentication()
{
try
{
var ldsContext = new PrincipalContext(ContextType.ApplicationDirectory, "localhost:389",
"OU=MyProject,OU=Applications,DC=Company,DC=ADAM",
ContextOptions.SimpleBind);
// Returns true if login details are valid
var isValid = ldsContext.ValidateCredentials("amurray", "ADAMComplexPassword1234", ContextOptions.SimpleBind);
}
catch (Exception e)
{
var msg = e.GetBaseException().Message;
Console.WriteLine(e);
System.Diagnostics.Debug.Print(msg);
}
}
答案 2 :(得分:0)
我的名字是ADAM,我不同意这种身份验证。
(哈哈,对不起,不得不这样做)
答案 3 :(得分:0)
我没有使用过ADAM或System.DirectoryServices,但我确实有使用LDAP和AD的经验;希望以下内容适用。
我以前从未见过以该格式提供的用户ID。 (它看起来像某种相对DN,如尾随逗号所示?)您是否尝试将用户ID指定为完整DN(根据标准LDAP的要求)或作为裸用户名(如果ADAM支持)?
在诊断这样的网络协议问题时(看看我的程序是否正在执行我认为我正在告诉它做的事情,看看它正在做什么与正在运行的程序正在做什么相比),我发现它有用为无效和正常运行的操作运行Wireshark以查看它们的不同之处。如果您从未使用过Wireshark,那么开始使用起来并不会太难:
Wireshark可以为您分析协议,因此您不必非常熟悉协议详细信息,尽管您知道的越多,解释所有细节就越容易。你可以启动一些Wireshark实例来轻松比较两种不同的捕获(你的代码和LDP)。