Asp.net core ASP.net Core 2.0的密码历史记录
我的要求之一是检查过去一年中的最后5个密码历史记录条目,以确保客户端没有重复使用密码 我已经在我的用户实体上创建了密码实体和密码集合 我需要创建一个自定义用户管理器,该管理器继承自Asp.net core ASP.net Core 2.0的密码历史记录,asp.net-core,asp.net-core-mvc,asp.net-identity,asp.net-core-2.0,Asp.net Core,Asp.net Core Mvc,Asp.net Identity,Asp.net Core 2.0,我的要求之一是检查过去一年中的最后5个密码历史记录条目,以确保客户端没有重复使用密码 我已经在我的用户实体上创建了密码实体和密码集合 我需要创建一个自定义用户管理器,该管理器继承自UserManager,并覆盖添加/更新密码以填充历史记录的方法。我还必须创建一个自定义密码验证器,该验证器继承PasswordValidator并重写validateSync方法 如何在.NETCore2.0中注册这些自定义实现?您是否必须用所有单独的依赖项注入调用替换服务.AddIdentity帮助程序?或者有没有
UserManager
,并覆盖添加/更新密码以填充历史记录的方法。我还必须创建一个自定义密码验证器,该验证器继承PasswordValidator
并重写validateSync
方法
如何在.NETCore2.0中注册这些自定义实现?您是否必须用所有单独的依赖项注入调用替换
服务.AddIdentity
帮助程序?或者有没有办法只覆盖UserManager
和PasswordValidator
片段?您只需在它们上面注册您的服务,就可以将默认注册的服务替换为AddIdentity()
调用。依赖项注入容器将保留所有注册,但当服务请求实例时,它将仅使用类型的最新注册。因此,您只需确保以与原始服务完全相同的方式注册您的服务。所以在疑问中,看看哪些服务是如何注册的
在您的情况下,您可能希望执行以下操作:
services.AddIdentity<MyUser, MyRole>();
services.AddScoped<UserManager<MyUser>, CustomUserManager>();
services.AddScoped<IPasswordValidator<MyUser>, CustomPasswordValidator>();
services.AddIdentity();
services.addScope();
services.addScope();
另一个在您的情况下有效并且可以在多个其他情况下有效的想法是搜索一种方法,该方法允许您在标识的同时添加不同的功能
例如:
services.AddIdentity<User, IdentityRole>()
.AddUserManager<UserManager>()
.AddDefaultTokenProviders();
Identity framework将为您完成所有DI工作:
public virtual IdentityBuilder AddPasswordValidator<TUser>() where TUser : class
{
return this.AddScoped(typeof (IPasswordValidator<>).MakeGenericType(this.UserType), typeof (TUser));
}
公共虚拟标识生成器AddPasswordValidator(),其中TUser:class
{
返回this.addScope(typeof(IPasswordValidator).MakeGenericType(this.UserType),typeof(TUser));
}
有趣。。。在查看实现时,我注意到他们使用了services.TryAddTransient
。根据Intellisense,只有在尚未注册的情况下,才会注册服务类型。所以现在我想知道是在调用AddIdentity()
之前还是之后注册它最好。将尝试这两种方法并发布结果。谢谢事实上,由于使用了TryAddScoped
和TryAddTransient
,我能够在调用AddIdentity
之前添加我的自定义实现。很高兴知道这一点!感谢您的回复:)
public virtual IdentityBuilder AddPasswordValidator<TUser>() where TUser : class
{
return this.AddScoped(typeof (IPasswordValidator<>).MakeGenericType(this.UserType), typeof (TUser));
}