2017-08-28 45 views
1

如何驗證IDM是否擁有登錄用戶的活動會話?用戶是否在IDMsrv上有活動會話?

詳細信息 - 如果user'A'從瀏覽器'X'在IDM上有一個活動會話,當同一用戶'A'嘗試使用瀏覽器'Y'登錄時,預期行爲將標識該用戶具有活動會話並使browser'X'會話。

背景 -

IDM與aspnetIdentity 客戶端與隱性補助 (30秒identitytoken生活,確實一直沒有去到登錄頁面,有望創下的IDM一些方法,然後我可以驗證用戶更新訪問令牌默默地有權訪問或不)!

回答

0

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

Issue raised

Should be like this @tibold

相關問題