如何驗證IDM是否擁有登錄用戶的活動會話?用戶是否在IDMsrv上有活動會話?
詳細信息 - 如果user'A'從瀏覽器'X'在IDM上有一個活動會話,當同一用戶'A'嘗試使用瀏覽器'Y'登錄時,預期行爲將標識該用戶具有活動會話並使browser'X'會話。
背景 -
IDM與aspnetIdentity 客戶端與隱性補助 (30秒identitytoken生活,確實一直沒有去到登錄頁面,有望創下的IDM一些方法,然後我可以驗證用戶更新訪問令牌默默地有權訪問或不)!
如何驗證IDM是否擁有登錄用戶的活動會話?用戶是否在IDMsrv上有活動會話?
詳細信息 - 如果user'A'從瀏覽器'X'在IDM上有一個活動會話,當同一用戶'A'嘗試使用瀏覽器'Y'登錄時,預期行爲將標識該用戶具有活動會話並使browser'X'會話。
背景 -
IDM與aspnetIdentity 客戶端與隱性補助 (30秒identitytoken生活,確實一直沒有去到登錄頁面,有望創下的IDM一些方法,然後我可以驗證用戶更新訪問令牌默默地有權訪問或不)!
Brock has already mentioned about it, It should be at the time of login and logout
它是有意義的,爲什麼它不是IDM。但至少在未來的版本中,它絕對有可能作爲增強功能提供。
配置文件服務,IsActive方法是通過授權和 tokenvalidation結束點。
所以在登錄時持續會話,然後當上面的代碼命中做檢查根據業務需求。
只要會話處於活動狀態(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被重新啓動的幾個缺點,如果用戶還沒有正確地退出。
可能有更好的選擇,這是不合適的。
更新: refer here duplicate/similar question
idmsrv endpoints are missing security change check
Should be like this @tibold