【问题标题】:Problems with Identity.TwoFactorRememberMe and updated user SecurityStampIdentity.TwoFactorRememberMe 和更新用户 SecurityStamp 的问题
【发布时间】:2020-02-28 18:04:41
【问题描述】:

使用双重身份验证应用程序登录后,我将 rememberClient 设置为 true,如下所示:

await _signInManager.TwoFactorAuthenticatorSignInAsync(code: request.Code,
                                                       isPersistent: request.IsPersistent,
                                                       rememberClient: request.RememberClient);

登录工作正常,我得到了 .AspNetCore.Identity.ApplicationIdentity.TwoFactorRememberMe cookie。如果我退出并再次登录,我不需要使用双因素。只要一切都好。

问题是当我对用户进行一些更改时,例如电话号码,并且 SecurityStamp 已更改。进行更改后,我使用await _signInManager.RefreshSignInAsync(user)。但是Identity.TwoFactorRememberMe cookie 没有更新。这会导致两个问题:

  1. 下次登录时,我必须再次使用双因素身份验证。
  2. 在同一会话期间,如果我使用await _signInManager.IsTwoFactorClientRememberedAsync(user) 检查用户是否记住了浏览器,则会导致错误“无法验证安全标记”并且.AspNetCore.Identity.Application 将被删除。

我尝试在更新.AspNetCore.Identity.Application cookie 的同时更新Identity.TwoFactorRememberMe cookie,如下所示:

await base.RefreshSignInAsync(user);
await RememberTwoFactorClientAsync(user);

它有效,但它也会为那些以前没有它的人设置Identity.TwoFactorRememberMe cookie。我无法检查它是否之前设置,因为然后我得到了我在上面(2)中描述的错误。

接下来我将尝试对我所做的每一个地方都做这样的事情来改变用户 SecurityStamp:

var isTwoFactorClientRemembered = await _signInManager.IsTwoFactorClientRememberedAsync(user);

// do the changes...

await _signInManager.RefreshSignInAsync(user);
if (isTwoFactorClientRememberedAsync)
    await _signInManager.RememberTwoFactorClientAsync(user);

我在这里缺少什么,或者这是唯一的方法吗?

我正在使用 IdentityServer4 和 SPA 应用程序,但我认为这与问题无关。

【问题讨论】:

    标签: asp.net-identity-3


    【解决方案1】:

    我最终在我的自定义 ApplicationSignInManager 中添加了一个方法:

    public async Task<TResult> KeepSignInAsync<TResult>(ApplicationUser user, Func<Task<TResult>> func)
    {
        var isTwoFactorClientRemembered = await IsTwoFactorClientRememberedAsync(user);
    
        var result = await func();
    
        await RefreshSignInAsync(user);
    
        if (isTwoFactorClientRemembered)
            await RememberTwoFactorClientAsync(user);
    
        return result;
    }
    

    当我更改将更新用户 SecurityStamp 的内容时,我会这样使用它:

    var result = await _signInManager.KeepSignInAsync(user, () => _userManager.SetPhoneNumberAsync(user, phoneNumber));
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2016-11-26
      • 2018-10-09
      • 2015-12-22
      • 2016-07-05
      • 2018-03-02
      相关资源
      最近更新 更多