IdentityServer4基于IP地址的

时间:2018-03-13 10:49:10

标签: c# asp.net asp.net-core identityserver4 claims-based-identity

IdentityServer4 IP地址透明登录

您好,我正在开发一个使用IdentityServer4作为身份验证/授权服务的项目。我们拥有或拥有自定义用户注入我们用于根据凭据验证用户的服务,而在ProfileService中,我们使用相同的用户来装饰额外的声明。 现在,如果有可能,我可以根据IP地址进行透明登录,在我们的自定义用户中,一些用户有一个ipaddress。

工作流程如下:当用户访问我们的客户端应用程序(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());
    }
}

1 个答案:

答案 0 :(得分:0)

如果你必须这样做(高度反对它)将是一个相对简单的等级检查。

在你的登录方法

  
      
  1. 获取用户IP地址(HttpContext.Connection.RemoteIpAddress.ToString())
  2.   
  3. 检查您的用户商店是否有具有分配的IP地址的用户
  4.   
  5. 如果地址存在,则使用该用户凭据自动登录并使用相关响应进行回复
  6.   
  7. 如果地址不存在,则加载ID4服务器的登录页面
  8.   

请注意,这些事情至少应该到位:

  • 您需要确保您的用户商店保留了IP地址 已批准的用户
  • 您需要确保您的用户商店得到更新 用户的新细节或更新细节

这应符合您使用IP地址进行自动登录的要求。

强调指出,除非有极端的要求,否则不得以任何方式或形式使用这种方法。

IP Spoofing如今很容易,它不好笑。此外,如果您的用户使用的VPN也会导致您的问题,尤其是在您开始构建地理阻止时。