2016-11-23 3 views
0

Thinktecture Identity Server 3 (OWIN 및 Katana)를 사용 중이며 문제없이 리소스 소유자의 흐름에 사용할 수 있습니다.Identity Server3 : Windows 인증 : AuthenticationResult가 항상 실패합니다.

그러나 Windows 사용자 인증에 관해서는 사용자 정의 UserService가 사용자를 확인하고 긍정적 인 AuthenticationResult를 반환한다는 것을 디버깅하는 동안 볼 수는 있지만 실패합니다.

누구나 구현 경험이 있습니까?

나는

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"));

잘못 여기에 사용자 정의 UserService의 코드를 게시하여야한다. 그것은해야한다 :

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

+0

감사 브록! 나는 그것을 시도하고 확인한다! –

+0

그게 문제인지는 모르지만 위의 코드가 결과를 올바르게 설정하지 못하고 있습니다. –

+0

예 Brock - 그게 문제였습니다. 고마워요! –