如何验证IDM是否有用户登录的活动会话?
细节-如果用户‘’从浏览器'X‘在IDM上有一个活动会话,当同一个用户'A’试图使用浏览器'Y‘登录时,预期的行为会识别该用户有活动会话并使浏览器’X‘会话失效。
背景-
IDM与aspnetIdentity客户端具有隐式授权(30秒的身份令牌生命周期,是否一直在默默地更新访问令牌而不登录页面,期望在登录页面上点击某个方法,那么我就可以验证用户是否有访问权限)!!
发布于 2017-09-04 00:20:40
这是合理的,为什么它不在Idm中。但至少在未来的版本中,提供这一增强功能是绝对可能的。
Profile,IsActive方法是授权和令牌验证的终结点。
因此,在登录时持久化会话,然后当上面的代码命中时,根据业务需求进行检查。
只要会话是活动的( cookie生存期),无声身份验证就会与应用程序逻辑一起传递。因此,这也可以由cookie生命周期来控制。
public override async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await userManager.FindByIdAsync(sub);
//Check existing sessions
if (context.Caller.Equals("AccessTokenValidation", StringComparison.OrdinalIgnoreCase))
{
if (user != null)
context.IsActive = !appuser.VerifyRenewToken(sub, context.Client.ClientId);
else
context.IsActive = false;
}
else
context.IsActive = user != null;
}签注
public async Task<IActionResult> Login(LoginInputModel model)
{
if (ModelState.IsValid)
{
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberLogin, false);
if (result.Succeeded)
{
//Update security stamp to invalidate existing sessions
//TODO: This didn't invalidate the existing cookie from another client
//var test= _userManager.UpdateSecurityStampAsync(_userManager.FindByEmailAsync(model.Email).Result).Result;
appUser.PersistSession(new UserSession
{
CreatedOn = DateTimeOffset.Now,
DeviceUniqueId = GetDeviceId(),
UserId = _userManager.FindByNameAsync(model.Email).Result.Id,
SId = httpContext.HttpContext.Session.Id,
ClientId= httpContext.HttpContext.Request.QueryString.Value.GetClientIdFromQuery(),
ExpiresOn = DateTimeOffset.Now.AddMinutes(appSettings.SessionTimeOut)
});
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(model.ReturnUrl);
}当IIS重新启动时,如果用户没有正确注册,此方法有几个缺点。
也许还有更好的选择--这不是最好的选择。
更新: 请参阅这里重复的/类似的问题
应该是这样 @tibold
https://stackoverflow.com/questions/45910885
复制相似问题