IdentityServer4 IP-адрес прозрачный вход
Здравствуйте, я работаю над проектом, который использует IdentityServer4 в качестве службы аутентификации / авторизации. У нас есть или собственный пользовательский магазин, внедренный в службу, которую мы используем для проверки пользователей на основе учетных данных, а в ProfileService мы используем тот же пользовательский магазин для украшения дополнительных утверждений. Теперь у меня есть задание, если это возможно, сделать прозрачный вход в систему на основе IP-адреса, в нашем пользовательском хранилище пользователей у некоторых пользователей есть IP-адрес.
Рабочий процесс выглядит следующим образом: когда пользователь переходит в наши клиентские приложения (asp.net mvc), а пользователь не аутентифицирован, он перенаправляется на IdentityServer, моя первая проверка здесь должна состоять в том, могу ли я разрешить пользователя на основе входящего IP-адрес, если это так, войдите в систему и выполните перенаправление в клиентское приложение, в противном случае отобразите страницу входа на сервер идентификации (на основе примера быстрого запуска).
Я нашел билет в проекте github, связанный с олицетворением, и, возможно, приблизил меня на шаг? На основе переопределения AuthorizeInteractionResponseGenerator https://github.com/IdentityServer/IdentityServer4/issues/853
на основе этого билета я создал псевдокод, но я не уверен, что это правильный путь?
public class IPAuthorizeInteractionResponseGenerator: AuthorizeInteractionResponseGenerator
{
private readonly ISystemClock _systemClock;
private IProfileService _profileService;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IMyAccountUserStore _myAccountUserStore;
public IPAuthorizeInteractionResponseGenerator(IMyAccountUserStore myAccountUserStore, IHttpContextAccessor httpContextAccessor,
ISystemClock clock, ILogger<AuthorizeInteractionResponseGenerator> logger, IConsentService consent, IProfileService profile) : base(clock, logger, consent, profile)
{
_systemClock = clock;
_profileService = profile;
_httpContextAccessor = httpContextAccessor;
_myAccountUserStore = myAccountUserStore;
}
public override Task<InteractionResponse> ProcessInteractionAsync(ValidatedAuthorizeRequest request, ConsentResponse consent = null)
{
var clientIp = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
var userByIp = _myAccountUserStore.FindUserByIp(clientIp);
if(userByIp == null)
return base.ProcessInteractionAsync(request, consent);
//user found by ip ...
var claims = new[]
{
new Claim(JwtClaimTypes.Name, userByIp.Username),
new Claim(JwtClaimTypes.GivenName, userByIp.FullName),
new Claim(JwtClaimTypes.Email, userByIp.Email),
new Claim(JwtClaimTypes.AuthenticationTime, _systemClock.UtcNow.DateTime.ToEpochTime().ToString())
};
var svr = new IdentityServerUser(userByIp.SubjectId) { AuthenticationTime = _systemClock.UtcNow.DateTime, AdditionalClaims = claims};
var claimsPrincipal = svr.CreatePrincipal();
request.Subject = claimsPrincipal;
return Task.FromResult(new InteractionResponse());
}
}