2017-08-28 56 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