使用ASP.NET身份验证和LDAP进行身份验证/授权

时间:2014-07-31 16:01:06

标签: c# asp.net authentication asp.net-web-api active-directory

我有一个现有的ASP.NET应用程序,它使用LDAP进行身份验证,使用ASP.NET成员身份进行身份验证和授权。

因此,LDAP用户可以选择使用其LDAP凭据或ASP.NET成员身份凭证进行身份验证。非LDAP用户只能使用LDAP凭据进行身份验证。

我现在想要创建一个使用类似方法进行身份验证和授权的Web API项目。

使用VS 2013,我创建了一个新的Web API项目,该项目使用Individual Accounts选项进行身份验证。

我已修改 Providers \ ApplicationOAuthProvider.cs 文件中的 GrantResourceOwnerCredentials 方法。

...
IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

if (user == null)
{
    context.SetError("invalid_grant", "The user name or password is incorrect.");
    return;
}
...

...
IdentityUser user;

if (AuthenticateActiveDirectory(context.UserName, context.Password, "MyADDomain"))
{
    user = await userManager.FindByNameAsync(context.UserName);
}
else
{
    user = await userManager.FindAsync(context.UserName, context.Password);
}

if (user == null)
{
    context.SetError("invalid_grant", "The user name or password is incorrect.");
    return;
}
...

AuthenticateActiveDirectory 方法是:

   private bool AuthenticateActiveDirectory(string userName, string password, string domain)
   {
     bool validation;
     try
     {
        var lcon = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false));
        var nc = new NetworkCredential(userName, password, domain);
        lcon.Credential = nc;
        lcon.AuthType = AuthType.Negotiate;
        lcon.Bind(nc);
        validation = true;
     }
     catch (LdapException)
     {
        validation = false;
     }
     return validation;
   }

这是有效的,但它是最好的方式还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

没关系。想到几件事:

  • 如果您的林中有多个域(或者曾经支持过),则用户名在整个林中都不是唯一的 - 只是域。看起来你现在正在键入用户名。
  • 对于您的LdapConnection,我假设空服务器名称仅用于此处显示?您可以使用S.DS.AD命名空间为您查找域控制器,而不是对其进行硬编码。
  • 你可能想要AuthType.Basic而不是在这里谈判。您将要确保您的连接是LDAP / S,因为信用证将是明文。