C# 预测UserManager.GenerateUserTokenAsync令牌的长度(通过DataProtectorTokenProvider)
我使用的是ASP.NET Core 3.1,带有一些自定义逻辑,可以重用ASP.NET Core Identity的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,它将: 因此,内存流长度的基本计算是:
UserManager
类。我想重用它的功能来生成sertokenasync(…)
,这与电子邮件确认中使用的令牌类型相同。出于应用程序的目的,我需要知道生成的令牌的最大长度
我做了以下研究:
UserManager.GenerateUserTokenAsync(…)
- 在我的情况下,这是
,它将:DataProtectorTokenProvider
- 因此,内存流长度的基本计算是:
DateTimeOffset.UtcNow的
27个字符 用户id为36个字符(GUID的字符串表示) 20个字符用于我的特定“用途”字符串 36个字符用于安全戳(GUID的字符串表示) ---- + 总共119个字符
- 在代码段中,这将得到
ed,然后转换为Protect
ToBase64String
我能以任何方式预测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);