IdentityServer4 Прозрачный вход на основе IP-адреса

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());
    }
}

person user6839906    schedule 13.03.2018    source источник
comment
он перенаправлен на IdentityServer, моя первая проверка здесь должна состоять в том, могу ли я разрешить пользователя на основе входящего IP-адреса, это ужасный способ аутентификации. IP-адреса можно подделать. Использование этого значительно снизит безопасность вашего веб-приложения и сделает вас уязвимыми для атак. Может быть, скажите своему начальству, чтобы сначала они взяли несколько уроков по основам безопасности, прежде чем предлагать такую ​​бессмыслицу. Если вам нужны защищенные клиентские машины, используйте рекомендуемые схемы. поток учетных данных клиента, если его уверенное серверное приложение, в противном случае поток кода   -  person Tseng    schedule 13.03.2018
comment
Вы не должны не аутентифицироваться через IP-адрес. Удаленный IP-адрес легко подделать и не является истинным идентификатором. Если вам нужен какой-то автоматический вход в систему, привязанный к конкретному клиенту, лучше всего использовать сертификат auth.   -  person Chris Pratt    schedule 13.03.2018
comment
Я бы повторил вышесказанное, но также рекомендовал бы вам обрабатывать пользовательскую аутентификацию вне среды IDS4 и вместо этого делать это в MVC. Способ составления IDS4 означает, что он хорошо отделен от проблем аутентификации, и имеет смысл сохранить это разделение.   -  person mackie    schedule 13.03.2018
comment
Если это необходимо, почему бы не использовать шлюз приложений?   -  person aaronR    schedule 14.03.2018


Ответы (1)


Если вы должны сделать это решение (категорически против), будет относительно простая проверка уровня.

в вашем методе входа в систему

  1. получить IP-адрес пользователя (HttpContext.Connection.RemoteIpAddress.ToString ())
  2. проверьте свой пользовательский магазин на предмет пользователя, которому назначен IP-адрес
  3. если адрес существует, автоматически войдите в систему, используя учетные данные этого пользователя, и ответьте соответствующим ответом
  4. если адрес не существует, загрузите страницу входа для сервера ID4

Обратите внимание, как минимум эти вещи должны быть на месте:

  • Вам нужно будет убедиться, что ваш пользовательский магазин сохраняет IP-адрес для утвержденного пользователя.
  • Вам нужно будет убедиться, что ваш пользовательский магазин обновляется новыми или обновленными данными о пользователе.

Это должно соответствовать вашим требованиям к использованию IP-адреса для автоматического входа в систему.

Подчеркивая, что этот подход ни в коем случае не следует использовать, если этого не диктует крайний набор требований.

В наши дни спуфинг IP настолько прост, что это уже не смешно. Также, если ваш пользователь использовал VPN, это также вызовет у вас проблемы, особенно после того, как вы начнете использовать геоблокировку.

person Aeseir    schedule 16.03.2018
comment
как я могу получить IP-адрес при реализации IProfileService или IResourceOwnerPasswordValidator? - person Arvind Maurya; 27.09.2019