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);
}
}
감사 브록! 나는 그것을 시도하고 확인한다! –
그게 문제인지는 모르지만 위의 코드가 결과를 올바르게 설정하지 못하고 있습니다. –
예 Brock - 그게 문제였습니다. 고마워요! –