C# 预测UserManager.GenerateUserTokenAsync令牌的长度(通过DataProtectorTokenProvider)

C# 预测UserManager.GenerateUserTokenAsync令牌的长度(通过DataProtectorTokenProvider),c#,azure,asp.net-core,asp.net-core-identity,C#,Azure,Asp.net Core,Asp.net Core Identity,我使用的是ASP.NET Core 3.1,带有一些自定义逻辑,可以重用ASP.NET Core Identity的UserManager类。我想重用它的功能来生成sertokenasync(…),这与电子邮件确认中使用的令牌类型相同。出于应用程序的目的,我需要知道生成的令牌的最大长度 我做了以下研究: UserManager.GenerateUserTokenAsync(…) 在我的情况下,这是DataProtectorTokenProvider,它将: 因此,内存流长度的基本计算是:

我使用的是ASP.NET Core 3.1,带有一些自定义逻辑,可以重用ASP.NET Core Identity的
UserManager
类。我想重用它的功能来
生成sertokenasync(…)
,这与电子邮件确认中使用的令牌类型相同。出于应用程序的目的,我需要知道生成的令牌的最大长度

我做了以下研究:

  • UserManager.GenerateUserTokenAsync(…)

  • 在我的情况下,这是
    DataProtectorTokenProvider
    ,它将:

  • 因此,内存流长度的基本计算是:

    DateTimeOffset.UtcNow的
    27个字符
    用户id为36个字符(GUID的字符串表示)
    20个字符用于我的特定“用途”字符串
    36个字符用于安全戳(GUID的字符串表示)
    ---- +
    总共119个字符
    
  • 在代码段中,这将得到
    Protect
    ed,然后转换为
    ToBase64String

当我在本地机器上随意测试时,得到了一个352个字符的加密字符串。我怎么能预测119个输入字符在加密时会变成352个字符?更糟糕的是,我的应用程序实际上是在Azure应用程序服务上运行的,Azure的应用程序应该在该服务中启动,可能与本地主机上的加密不同


我能以任何方式预测Azure App Services上生成的用户令牌的最大长度吗?我很乐意包含一个误差范围,但我不知道这需要什么。

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

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

所以,有了它352会带来一个问题,在你的例子中,邮票真的是36吗

36个字符用于安全戳(GUID的字符串表示)

另外,在已部署的环境中,请确保,因为应用程序服务的每个实例都需要指向同一个密钥

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);