我首先要说的是,我不知道我想要的是否真的可以做到。如果是这样的话,请不要犹豫,告诉我,我在做梦。
我想在C#中创建一个自定义的活动目录“authenticator”。我的意思是,我希望每当有人登录时,首先检查存储在AD中的密码,然后执行第二步认证。只有当两个步骤都通过时,用户才能登录。
现在,我想上面的内容并不算太多,只要我想将这个身份验证器集成到一个定制产品中,对吧?我是否完全疯了,也想知道这个验证器是否可以用于登录Windows本身?或者也许是预先存在的产品,可以对AD进行身份验证?
如果我没有做梦,是否有人也知道有什么好的文章/ API让我去? API不一定是免费的,因为我愿意花一些钱来让事情变得更快。
答案 0 :(得分:2)
这完全可行。但是我想要注意的是,当发布绑定到Active Directory的服务器时,您将检查提供的用户名(通常是sAMAccountName)和在一个操作中输入的密码。有几种方法可以在C#中执行此操作,但许多人(包括我自己)选择使用System.DirectoryServices
和System.DirectoryServices.Protocols
命名空间。
这是我当前将用户绑定到Active Directory的方式,然后根据此方法的结果,我显示授权失败的原因,或者我允许他们继续在应用程序中的帐户。
//Define your connection
LdapConnection ldapConnection = new LdapConnection("123.456.789.10:389");
try
{
//Authenticate the username and password
using (ldapConnection)
{
//Pass in the network creds, and the domain.
var networkCredential = new NetworkCredential(Username, Password, Domain);
//Since we're using unsecured port 389, set to false. If using port 636 over SSL, set this to true.
ldapConnection.SessionOptions.SecureSocketLayer = false;
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
//To force NTLM\Kerberos use AuthType.Negotiate, for non-TLS and unsecured, use AuthType.Basic
ldapConnection.AuthType = AuthType.Basic;
ldapConnection.Bind(networkCredential);
}
catch (LdapException ldapException)
{
//Authentication failed, exception will dictate why
}
}
如果您想更进一步并检索有关此用户的属性,check out this thread here。
此外,我高度推荐使用Softerra的LDAP浏览器来测试与LDAP相关的任何内容 - 这是一个很棒的产品,它是免费的。你可以download it from here.
希望这会让你朝着正确的方向前进。