Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.net Core 2.0的密码历史记录_Asp.net Core_Asp.net Core Mvc_Asp.net Identity_Asp.net Core 2.0 - Fatal编程技术网

Asp.net core ASP.net Core 2.0的密码历史记录

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帮助程序?或者有没有

我的要求之一是检查过去一年中的最后5个密码历史记录条目,以确保客户端没有重复使用密码

我已经在我的用户实体上创建了密码实体和密码集合

我需要创建一个自定义用户管理器,该管理器继承自
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));
 }