我在项目中使用Asp.netCore identity
,我添加了此软件包:
"IdentityServer4.AspNetIdentity": "1.0.0",
在我的项目中,我使用此方法来生成reset password token
:
string code = await _userManager.GeneratePasswordResetTokenAsync(user);
它可以正常工作,但是生成的代码是这样的:
/DgEiBeBT3zArfkZzxY8/hxCebWeT3cV/c xXdQDV2w9AOey7iW5KwsJYtuaV qe87KSXRnmYXNNrw2NY2DQNWsMgy3vxBIZgkgnUGk6ekxItf5XUmxRl5g6bFHZ2XHRBqmpcbj1yGDpoYkUkYvXUhtaDvszgmVOn8GjmFsyrPwFY5ARsd4LYygclKWFCG2TsAEkixVIwqmliBeITrzCGm4HoM i1nm15ZRb/bA
是否有一种方法可以自定义此方法返回六位数号码 而不是上面的字符串?
为了自定义您必须创建自己的自定义令牌提供商的生成代码(您在下面看到的是在编写自己的代码之前必须粘贴的最低限度):
public class CustomPasswordResetTokenProvider<TUser> : IUserTwoFactorTokenProvider<TUser> where TUser : User
{
private readonly YourDbContext _db;
public DataProtectionTokenProviderOptions Options { get; }
public IDataProtector Protector { get; }
public string Name => Options.Name;
public CustomPasswordResetTokenProvider(
IDataProtectionProvider dataProtectionProvider,
IOptions<CustomPasswordResetTokenProviderOptions> options,
YourDbContext db)
{
if (dataProtectionProvider == null)
throw new ArgumentNullException(nameof(dataProtectionProvider));
Options = options?.Value ?? new DataProtectionTokenProviderOptions();
Protector = dataProtectionProvider.CreateProtector(Name ?? "DataProtectorTokenProvider");
_db = db;
}
public async Task<string> GenerateAsync(string purpose, UserManager<TUser> userManager, TUser user)
{
// create and store your custom (i.e.: 6 digit) code in the database
}
public async Task<bool> ValidateAsync(string purpose, string encodedToken, UserManager<TUser> userManager, TUser user)
{
// check if the code in the database is correct
}
}
public class CustomPasswordResetTokenProviderOptions : DataProtectionTokenProviderOptions { }
之后,您必须在ConfigureServices()
方法中以AddIdentity()
功能提供令牌提供商:
services.AddIdentity<YourUser, ...>(o =>
{
...
o.Tokens.PasswordResetTokenProvider = typeof(CustomPasswordResetTokenProvider<User>).Name.Split("`")[0];
})
.AddRoles<...>()
.AddEntityFrameworkStores<YourDbContext>()
.AddDefaultTokenProviders()
.AddTokenProvider<CustomPasswordResetTokenProvider<User>>("CustomPasswordResetTokenProvider");
此外,显然,如今,Microsoft使用这些令牌的首选方法根本不是将它们存储在DB中,而是以确定性的方式生成它们,因此可以在验证期间再生和检查它们而不会浪费其他空间。<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>