我正在处理两个域 - 一个是受信任的域。一个域上可能有JohnSmith,另一个域上可能有另一个JohnSmith。这两个人都需要登录我的应用程序。
我的问题:我传入的域名无关紧要 - 此代码返回true! 我如何知道JohnSmith正在登录哪个?
static public bool CheckCredentials(
string userName, string password, string domain)
{
using (var context = new PrincipalContext(ContextType.Domain, domain))
{
return context.ValidateCredentials(userName, password);
}
}
答案 0 :(得分:5)
ValidateCredentials
适用于userPrincipalName
您可以尝试构建第一个参数(用户名),将登录信息与域名相结合,以创建用户名JohnSmith@dom1.com
与JohnSmith@dom2.com
。
答案 1 :(得分:4)
您始终可以使用
检索已登录用户的完整DNUserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName);
up.UserPrincipalName // shows user@domain.com
up.DistinguishedName // shows CN=Surname,OU=group,DC=domain,DC=com
up.SamAccountName // shows login name
将up.SamAccountName用于后续调用ValidateCredentials,包括域名 - 毕竟,您无法使用相同的sAMAccountName登录2个用户!
DistinguishedName肯定会告诉你JohnSmith登录的是什么。
答案 2 :(得分:2)
根据JPBlanc的回答,我重写了我的代码。我还添加了一个try / catch,以防传入虚假域名。
static public bool CheckCredentials(
string userName, string password, string domain)
{
string userPrincipalName = userName + "@" + domain + ".com";
try
{
using (var context = new PrincipalContext(ContextType.Domain, domain))
{
return context.ValidateCredentials(userPrincipalName, password);
}
}
catch // a bogus domain causes an LDAP error
{
return false;
}
}
答案 3 :(得分:0)
对于包含不同电子邮件地址的域,接受的答案将失败。例如:
Domain = Company
User1 = employee@department1.com (under company Domain)
User2 = employee2@Department2.com (under company Domain)
提供的答案将使用以下内容返回false:
userName = "employee";
domain = "company";
string userPrincipalName = userName + "@" + domain + ".com";
跨域包含用户的正确方法是:
string userPrincipalName = userName + "@" + domain;
没有.com部分,它会在该域中搜索用户,而不是在全局域中搜索电子邮件。