我正在使用IdentityServer4并使用ASP.NET身份,并希望进行自定义密码验证,以便我可以为密码到期添加验证(例如,如果密码大于90天然后使用户更改密码等...)。
我在启动 ConfigureServices()
设置services.AddIdentity
时跨过方法.AddPasswordValidator<>
,但无法找到有关如何实现它的清晰文档。
任何人都可以帮助实施或指向我指向类似事物的一些示例代码吗?(或者可能有助于了解使用IdentityServer的用户/密码的一些自定义验证4)?
我不认为密码验证器是您需要的,但是自从您问 -
自定义密码验证器的示例(不是我的代码,链接到下面的文章):
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
表中添加一个字段(您可以通过扩展从IdentityUser
继承的类来完成此操作(可能称为PasswordChangedAt
日期字段的ApplicationUser
)。
然后,每次用户登录时,您都应自己检查该验证。
P.S:重要的是要意识到密码的强度或与您的用户商店有关的任何事情实际上与IdentityServer无关。身份服务器充当您的STS(安全令牌服务)。
我花了一些时间才意识到自己,这就是为什么我认为值得一提的是,尽管这对您来说可能很明显。