自定义多因素Active Directory身份验证

时间:2013-04-16 12:18:41

标签: c# .net windows active-directory

我首先要说的是,我不知道我想要的是否真的可以做到。如果是这样的话,请不要犹豫,告诉我,我在做梦。

我想在C#中创建一个自定义的活动目录“authenticator”。我的意思是,我希望每当有人登录时,首先检查存储在AD中的密码,然后执行第二步认证。只有当两个步骤都通过时,用户才能登录。

现在,我想上面的内容并不算太多,只要我想将这个身份验证器集成到一个定制产品中,对吧?我是否完全疯了,也想知道这个验证器是否可以用于登录Windows本身?或者也许是预先存在的产品,可以对AD进行身份验证?

如果我没有做梦,是否有人也知道有什么好的文章/ API让我去? API不一定是免费的,因为我愿意花一些钱来让事情变得更快。

1 个答案:

答案 0 :(得分:2)

这完全可行。但是我想要注意的是,当发布绑定到Active Directory的服务器时,您将检查提供的用户名(通常是sAMAccountName)和在一个操作中输入的密码。有几种方法可以在C#中执行此操作,但许多人(包括我自己)选择使用System.DirectoryServicesSystem.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.

希望这会让你朝着正确的方向前进。