[C#,. NET]:通过IdentityServer3通过LDAP验证用户

时间:2016-06-28 02:17:52

标签: c# oauth-2.0 ldap openid-connect identityserver3

我需要一种通过IdentityServer3验证组织内用户(使用LDAP和Active Directory)的方法,并授予他们访问资源的权限。

IdentityServer3似乎是OpenID Connect协议的实现框架,适用于身份验证和授权。

到目前为止,我已经能够验证硬编码用户并使用InMemory实现获得JWT(JSON Web令牌)访问令牌。

请参考此示例:

https://rajdeep.io/2015/05/07/creating-a-single-sign-on-using-thinktecture-identity-server-part-1/

但是,在我必须验证大型组织中的用户(存储在活动目录中)并发出令牌以访问资源的情况下,这不会非常有用。

以下是我根据此链接所做的事情

http://stackoverflow.com/questions/31536420/thinktecture-identityserver-v3-with-windowsauth):

  1. 创建了一个实现IUserService的ActiveDirectoryUserService。

    namespace LDAPSSO
    {
    public class ActiveDirectoryUserService : IUserService
    {
     private const string DOMAIN = "company domain";
    
     public Task<AuthenticateResult> AuthenticateExternalAsync(ExternalIdentity externalUser, SignInMessage message)
    {
        return Task.FromResult<AuthenticateResult>(null);
    }
    
    public Task<AuthenticateResult> AuthenticateLocalAsync(string username, string password, SignInMessage message)
    {
        try
        {
            using (var pc = new PrincipalContext(ContextType.Domain, DOMAIN))
            {
                if (pc.ValidateCredentials(username, password))
                {
                    using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, username))
                    { 
                        if (user != null)
                        {
                            return Task.FromResult(new AuthenticateResult(subject: Guid.NewGuid().ToString(), name: username));
                        }
                    }
                }
    
                // The user name or password is incorrect
                return Task.FromResult<AuthenticateResult>(null);
            }
        }
        catch
        {
            // Server error
            return Task.FromResult<AuthenticateResult>(null);
        }
      }
     }
    }
    
  2. 参考:的https://gist.github.com/tjrobinson/0ad6c790e90d7a385eb1

    1. 创建了一个实现IClientStore的MyClientStore
    2. 创建了一个实现IScopeStore的MyScopeStore
    3. 按如下方式将此注册到工厂:

      public class Factory
      {
       public static IdentityServerServiceFactory Configure()
       {
      
        var factory = new IdentityServerServiceFactory
           {
              UserService = new Registration<IUserService, ActiveDirectoryUserService>(), // Don't need, but mandatory for idsvr3
              ClientStore = new Registration<IClientStore, MyClientStore>(),
              ScopeStore = new Registration<IScopeStore, MyScopeStore>()
          };
        return factory;
      
      }
      
    4. 即使我有这个工作,是否需要通过身份服务器提供的登录表单与用户输入的凭据进行比较? (请看下图):

      Authorization Server Login

      我需要做些什么才能从IdentityServer3登录页面中提取用户凭据并针对Active Directory进行验证?

      这是正确的做法吗?请建议。

      赞赏输入和建议。

      提前谢谢!

1 个答案:

答案 0 :(得分:2)

我会将Active Directory实现为external identity provider

这样您就不必维护任何自定义代码,并且如果您被锁定,则继续使用AD的LDAP功能。您可以通过禁用Identity Server中的本地登录或使用acr_values中的idp值或甚至per client basis上的userFeet - feet来使其成为您唯一的身份提供商。