2016-11-23 10 views
0

Я использую Thinktecture Identity Server 3 (OWIN и Katana) и смог заставить его работать для потока ресурсов без проблем.Identity Server3: Аутентификация Windows: аутентификацияРезультат всегда не работает

Однако, когда дело доходит до аутентификации пользователей Windows, это не удается, хотя во время отладки я могу видеть, что мой пользовательский UserService проверяет пользователя и возвращает положительный AuthenticationResult.

Кто-нибудь испытал это в их реализации?

Я должен разместить код для пользовательского UserService здесь

public class ActiveDirectoryUserService : IUserService 
{ 
    private const string Domain = "xxxxx"; 

    public Task PreAuthenticateAsync(PreAuthenticationContext context) 
    { 
     return Task.FromResult<AuthenticateResult>(null); 
    } 

    public Task AuthenticateLocalAsync(LocalAuthenticationContext context) 
    { 
     try 
     { 
      using (var pc = new PrincipalContext(ContextType.Domain, Domain)) 
      { 
       if (pc.ValidateCredentials(context.UserName, context.Password)) 
       { 
        using (
         var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, context.UserName)) 
        { 
         if (user != null) 
         { 
          return 
           Task.FromResult(new AuthenticateResult(context.UserName, context.UserName, identityProvider: "windows")); 
         } 
        } 
       } 

       // The user name or password is incorrect 
       return Task.FromResult<AuthenticateResult>(null); 
      } 
     } 
     catch 
     { 
      // Server error 
      return Task.FromResult<AuthenticateResult>(null); 
     } 
    } 

    public Task AuthenticateExternalAsync(ExternalAuthenticationContext context) 
    { 
     return Task.FromResult<AuthenticateResult>(null); 
    } 

    public Task PostAuthenticateAsync(PostAuthenticationContext context) 
    { 
     return Task.FromResult<AuthenticateResult>(context.AuthenticateResult); 
    } 

    public Task SignOutAsync(SignOutContext context) 
    { 
     return Task.FromResult<AuthenticateResult>(null); 
    } 

    public Task GetProfileDataAsync(ProfileDataRequestContext context) 
    { 
     using (var pc = new PrincipalContext(ContextType.Domain, Domain)) 
     { 
      using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, context.Subject.Identity.Name)) 
      { 
       if (user != null) 
       { 
        var identity = new ClaimsIdentity(); 
        identity.AddClaims(new[] 
        { 
         new Claim(Constants.ClaimTypes.Name, user.DisplayName), 
         new Claim(Constants.ClaimTypes.Email, user.EmailAddress) 
        }); 

        if (context.RequestedClaimTypes != null) 
         return Task.FromResult(identity.Claims.Where(x => context.RequestedClaimTypes.Contains(x.Type))); 

        return Task.FromResult(identity.Claims); 
       } 
      } 
      return Task.FromResult<IEnumerable<Claim>>(null); 
     } 
    } 

    public Task IsActiveAsync(IsActiveContext context) 
    { 
     return Task.FromResult(context.IsActive); 
    } 
} 

The response is always invalid username and password

ответ

0

return Task.FromResult(new AuthenticateResult(context.UserName, context.UserName, identityProvider: "windows"));

неправильно. это должно быть:

context.AuthenticateResult = new AuthenticateResult( context.UserName, context.UserName); return Task.FromResult(0);

+0

Спасибо, Брок! Я попробую это и подтвержу! –

+0

Я не знаю, если это ваша проблема, но ваш код выше не устанавливает результат правильно. –

+0

Да, Брок - вот в чем проблема. Большое спасибо! –