检查用户名/密码
我在Windows Vista Ultimate SP1上使用以下代码来查询我们的活动目录服务器,以检查域上用户的用户名和密码。
public Object IsAuthenticated()
{
String domainAndUsername = strDomain + "" + strUser;
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, strPass);
SearchResult result;
try
{
//Bind to the native AdsObject to force authentication.
DirectorySearcher search = new DirectorySearcher(entry) { Filter = ("(SAMAccountName=" + strUser + ")") };
search.PropertiesToLoad.Add("givenName"); // First Name
search.PropertiesToLoad.Add("sn"); // Last Name
search.PropertiesToLoad.Add("cn"); // Last Name
result = search.FindOne();
if (null == result)
{
return null;
}
//Update the new path to the user in the directory.
_path = result.Path;
_filterAttribute = (String)result.Properties["cn"][0];
}
catch (Exception ex)
{
return new Exception("Error authenticating user. " + ex.Message);
}
return user;
}
目标是使用.NET 3.5,并使用VS 2008标准进行编译
我使用的是正在运行应用程序的域管理员的域帐户登录。
该代码在Windows XP上完美工作; 但是在Vista上运行时出现以下异常:
System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
我试过更改认证类型,我不确定发生了什么。
另请参阅:根据Active Directory验证用户名和密码?
如果您使用.net 3.5,请改用此代码。
要认证用户:
PrincipalContext adContext = new PrincipalContext(ContextType.Domain);
using (adContext)
{
return adContext.ValidateCredentials(UserName, Password);
}
如果您需要查找用户对该对象的R / W属性,请执行以下操作:
PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipal foundUser =
UserPrincipal.FindByIdentity(context, "jdoe");
这是使用System.DirectoryServices.AccountManagement命名空间,因此您需要将它添加到您的使用语句中。
如果您需要将UserPrincipal对象转换为DirectoryEntry对象以使用旧代码,则可以这样做:
DirectoryEntry userDE = (DirectoryEntry)foundUser.GetUnderlyingObject();
我发现在多个网站上的互联网上存在相同的代码,但它并不适合我。 Steve Evans可能是对的,如果你使用.NET 3.5,你不应该使用这个代码。 但是,如果您仍然使用.NET 2.0,则可以尝试使用此功能对AD服务进行身份验证:
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,
userName, password,
AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer);
object nativeObject = entry.NativeObject;
第一行使用域,用户名和密码创建一个DirectoryEntry对象。 它还设置AuthenticationTypes。 请注意,我如何使用两个参数之间的“按位或”('|')运算符来设置安全(Kerberos)身份验证和SSL。
第二行强制使用来自第一行的信息将“入口”的NativeObject绑定到AD服务。
如果抛出异常,则证书(或设置)不好。 如果没有例外,那么您已通过身份验证。 异常消息通常会指出发生了什么问题。
此代码与您已有的代码非常相似,但该域用于具有“路径”的位置,并且用户名不与域组合。 请务必正确设置您的AuthenticationTypes。 这可能会导致或破坏身份验证的能力。
无论如何,我想通了它如果你在域名与Vista的用户名传递它不像“域用户”,所以只是传递“用户”而不是似乎工作正常 - 除了你必须在同一个域
链接地址: http://www.djcxy.com/p/36075.html