如何在ASP.NET核心身份中自定义重置密码令牌



我在项目中使用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>

相关内容

  • 没有找到相关文章