Я использую 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);
}
}
Спасибо, Брок! Я попробую это и подтвержу! –
Я не знаю, если это ваша проблема, но ваш код выше не устанавливает результат правильно. –
Да, Брок - вот в чем проблема. Большое спасибо! –