如何使用带有 ASP.NET Microsoft Identity 的自定义密码验证的 IdentityServer4

How to use IdentityServer4 with Custom password validation with ASP.NET Microsoft Identity

我正在使用 IdentityServer4 并使用 ASP.NET Identity,我想进行自定义密码验证,以便我可以添加密码过期验证(例如,如果密码超过 90 天,则让用户更改密码等...)。

我在 Startup.cs 的 ConfigureServices() 方法中设置 services.AddIdentity 时 运行 跨越了方法 .AddPasswordValidator<> ,但无法找到任何明确的有关如何实施它的文档。

任何人都可以帮助实现或指出一些类似的示例代码吗? (或者可能有助于理解我在哪里/如何使用 IdentityServer4 实现 users/passwords 的一些自定义验证)?

我认为密码验证器不是您所需要的,但既然您已经问过 -
自定义密码验证器的示例(不是我的代码,下面文章的 link):

public class SameCharacterPasswordValidator<TUser>: IPasswordValidator<TUser> 
       where TUser : class
{
    public Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, 
                                              TUser user, 
                                              string password)
    {
        return Task.FromResult(password.Distinct().Count() == 1 ? 
            IdentityResult.Failed(new IdentityError
            {
                Code = "SameChar",
                Description = "Passwords cannot be all the same character."
            }) : 
            IdentityResult.Success);
    }
}

您可以在 ConfigureServices 方法中应用自定义验证器

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    // Basic built in validations
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireNonLetterOrDigit = true;
    options.Password.RequireUppercase = true;
    options.Password.RequiredLength = 6;
})
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders()
    // Your custom validator here
    .AddPasswordValidator<SameCharacterPasswordValidator<ApplicationUser>>();

这是一篇关于 ASP.NET Identity 的密码验证器的好文章: https://elanderson.net/2016/03/asp-net-core-password-options-and-custom-validators/

请注意,密码验证器旨在检查密码是否采用您希望的格式(类似于正则表达式)。因此,密码过期与此无关。这是您密码的元数据,与密码格式无关。
对于该用例,您可以在 AspNetUsers table 中添加一个字段(您将能够它通过扩展 PasswordChangedAt 日期字段的 IdentityUser(可能称为 ApplicationUser)继承的 class。
然后,每次用户登录时,您都应该自己检查该验证。

P.S: 重要的是要意识到密码的强度或任何与您的用户存储有关的东西实际上与 IdentityServer 无关. IdentityServer 充当您的 STS(安全令牌服务)。
我自己花了一些时间才意识到这一点,这就是为什么我认为它值得一提,尽管它对你来说可能是显而易见的。