c# - 预测 UserManager.GenerateUserTokenAsync token 的长度(通过 DataProtectorTokenProvider)

标签 c# azure asp.net-core asp.net-core-identity

我正在使用 ASP.NET Core 3.1,以及一些重用 ASP.NET Core Identity 的 UserManager<TUser> 的自定义逻辑。类(class)。我想重用它的能力GenerateUserTokenAsync(...) ,相同类型的 token 也用于例如电子邮件确认。出于我的应用程序的目的,我需要知道生成的 token 的最大长度

我做了以下研究:

  • UserManager<TUser>.GenerateUserTokenAsync(...) calls GenerateAsync on the injected provider

  • 就我而言,这是 DataProtectorTokenProvider<TUser>这将 generate tokens like this :

    var ms = new MemoryStream();
    var userId = await manager.GetUserIdAsync(user);
    using (var writer = ms.CreateWriter())
    {
        writer.Write(DateTimeOffset.UtcNow);
        writer.Write(userId);
        writer.Write(purpose ?? "");
        string stamp = null;
        if (manager.SupportsUserSecurityStamp)
        {
            stamp = await manager.GetSecurityStampAsync(user);
        }
        writer.Write(stamp ?? "");
    }
    var protectedBytes = Protector.Protect(ms.ToArray());
    return Convert.ToBase64String(protectedBytes);
    
  • 因此内存流长度的基本计算是:

    27 characters for DateTimeOffset.UtcNow
    36 characters for the user id (string representation of a GUID)
    20 characters for my specific "purpose" string
    36 characters for the security stamp (string representation of a GUID)
    ---- +
    119 characters in total
    
  • 在代码片段中,得到 Protect编辑然后转换ToBase64String

当我在本地计算机上随意测试时,我得到了一个 352 个字符的加密字符串。我如何预测 119 个输入字符加密后会变成 352 个字符?更糟糕的是,我的应用程序实际上在生产环境中运行在 Azure 应用服务上,其中 Azure 的 DPAPI应该启动,可能使用与本地主机不同的加密?

我能否以任何方式预测 Azure 应用服务上生成的用户 token 的最大长度是多少?我很乐意包含一定的误差范围,但我不知道这需要什么是。

最佳答案

默认情况下,DPAPI 使用 AES-256-CBC 作为加密算法,除非您通过 UseCryptographicAlgorithms 更改它。根据默认算法,对于您的情况,计算将如下所示:

由于它是 AES 256,因此它可以使用 32 字节 block 。因此,使用 CBC 填充,输出变为 ((119/32) + 1) * 32 + 16 (IV) = 144。经过 base64 后,它变为 192。

那么,352 会带来一个问题,在你的情况下,邮票真的是 36 吗?

36 characters for the security stamp (string representation of a GUID)

此外,在部署环境中,请确保store data protection key outside app因为应用服务的每个实例都需要指向相同的 key 。

关于c# - 预测 UserManager.GenerateUserTokenAsync token 的长度(通过 DataProtectorTokenProvider),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62760060/

相关文章:

azure - [U-SQL]][FlexExtractor] 我无法加入。表达式必须都是列

Azure Kubernetes LB 注释

c# - 无法创建 Azure WebSpace

ASP.net Core 2.0 JWT token 刷新

c# - 有没有办法直接从 C# 应用程序将文件写入 Azure Blob 存储?

c# - Oracle ODP.NET 托管驱动程序在 64 位中的运行速度比在 32 位中慢 50-100%

c# - 在 C# 中设置风扇速度

c# - 如何在 .net core 中使用 JwtSecurityTokenHandler 和 Compression DEFLATE 生成/验证 JWT token

html - 如何制作自适应 iFrame 高度?

c# - VS 2010、NUNit 和 "The breakpoint will not currently be hit. No symbols have been loaded for this document"