我目前使用LogonUser()在我办公室的本地域上验证用户的用户名和密码,它非常适合我需要它做的事情。
自从我开发应用程序以来,我现在需要让它在我的VPN上工作。似乎LogonUser()无法使用REMOTELY验证凭据。或者会吗?是否可以使用LogonUser()在REMOTE域帐户上验证用户的凭据?
我已经在一些地方读过使用LOGON32_LOGON_NEW_CREDENTIALS作为第4个参数(登录类型)而LOGON32_PROVIDER_WINNT50作为第5个参数(提供者)就可以了。但每次我尝试我总是获得成功...我可以提供一个bogas用户并通过它,它将每次都有效:(。
想法?
编辑 - 添加了备注
尝试使用此功能,但我一直得到异常,告诉我用户/通行证是坏的。
public bool Win2kCredentialsIsValid(string domain, string username, string password)
{
string adPath = "LDAP://" + domain + "/rootDSE";
DirectoryEntry adRoot = new DirectoryEntry(adPath, domain + "\\" + username, password, AuthenticationTypes.ReadonlyServer);
try
{
object o = adRoot.Properties["defaultNamingContext"];
}
catch
{
return false;
}
return true;
}
- 编辑 - 添加更多笔记
好的所以我尝试了另一个例子,只是为了让它开始工作并开始沿着这条路走下去,有几件事要注意......
我尝试做这项工作并得到以下错误......
提供的上下文类型与联系的服务器不匹配。服务器类型是Domain。
这出错了:var context = new PrincipalContext(ContextType.ApplicationDirectory,“MyServerHostName:389”,“DC = MyDomain,DC = local”))
private bool CheckADCredentials()
{
bool bResults;
using (var context = new PrincipalContext(ContextType.ApplicationDirectory,
"MyServerHostName:389",
"DC=MyDomain,DC=local"))
{
var username = "firstname.lastname";
var email = "firstname.lastname@MyServerHostName";
var password = "123456";
var user = new UserPrincipal(context)
{
Name = username,
EmailAddress = email
};
user.SetPassword(password);
user.Save();
if (context.ValidateCredentials(username, password, ContextOptions.SimpleBind))
{
bResults = true;
}
else
{
bResults = false;
}
user.Dispose();
}
return bResults;
}
答案 0 :(得分:1)
我最终选择了另一种解决方案。我没有尝试在我的PC没有连接到的域上验证用户的帐户,而是最终在数据库中缓存了我的域凭据,并且刚刚构建了一个盐渍的MD5类型加密函数,因此它会让它变得困难......对某人来说......破解它。 ;)
现在我只是在远程工作时验证数据库中的缓存凭据...它只是要求用户首先登录域,然后用户可以日夜远程使用它。 ;)
谢谢!