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());
}
}
答案 0 :(得分:0)
如果你必须这样做(高度反对它)将是一个相对简单的等级检查。
在你的登录方法
- 获取用户IP地址(HttpContext.Connection.RemoteIpAddress.ToString())
- 检查您的用户商店是否有具有分配的IP地址的用户
- 如果地址存在,则使用该用户凭据自动登录并使用相关响应进行回复
- 如果地址不存在,则加载ID4服务器的登录页面
醇>
请注意,这些事情至少应该到位:
这应符合您使用IP地址进行自动登录的要求。
强调指出,除非有极端的要求,否则不得以任何方式或形式使用这种方法。
IP Spoofing如今很容易,它不好笑。此外,如果您的用户使用的VPN也会导致您的问题,尤其是在您开始构建地理阻止时。