UserManager<TUser>管理用户,如何修改identity默认hash加密算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UserManager<TUser>管理用户,如何修改identity默认hash加密算法相关的知识,希望对你有一定的参考价值。

参考技术A 项目需要做一个统一认证授权服务,于是想到identityserver4。identityserver4使用暂时不提,网上好多大神示例。在使用identityserver4做单点登录(SSO)时候有一个需求,那就是当前正在使用的系统要接入SSO。

在看了好多大神示例跟着官方入门指南,噼里啪啦一顿操作猛如虎。系统弄好了,问题也来了,那就是identityserver4新系统这边使用的是UserManager<TUser>管理用户,用户加密和校验都是使用PasswordHasher,算法高端大气上档次;而老系统用户密码是使用MD5加密,老系统用户直接导入新系统也是没法用的,咋办?

1.旧系统,在用户登录时候记下明文密码,或者用明文密码通过PasswordHasher算法加密后保存下来,之后再导入SSO系统
2.修改identityserver4系统的加密算法
决定修改identityserver4系统的加密算法,但是新问题来了。新系统中使用UserManager<TUser>管理用户,如果弃用修改起来很麻烦,而且非常不友好。

网上查了下,好多人都是在UserManager<TUser>做手脚,我也从这方便寻找解决方案。
查看UserManager注册登录密码校验,都是通过这个 PasswordHasher进行。

看下这个IPasswordHasher<TUser>从何而来,从AddIdentity进去看看都有哪些

从上图可以看出, IPasswordHasher<TUser>是从在AddIdentity时候注入的。那么好办了,自定义CustomPasswordHasher<TUser> 继承字 IPasswordHasher<TUser>,然后再注入进去。

接下来看 IPasswordHasher<TUser>接口有哪些接口需要实现。

IPasswordHasher<TUser>就两个方法
1.string HashPassword(TUser user, string password) 负责加密
2.PasswordVerificationResult VerifyHashedPassword(TUser user,string hashedPassword,string providedPassword); 负责校验

新建一个类CustomPasswordHasher类,使用MD5加密,具体如下

由于identity默认是

注意这个关键词TryAddScoped,也就是说我们在AddIdentity之前之后把CustomPasswordHasher注入,都会覆盖掉默认的。如果是AddScoped,不是TryAddScoped,我们必须添加在AddIdentity之后,因为Asp.net core DI注入后面会覆盖前面的。所以在startup中,把我们自定义注入即可。

1.自定义一个CustomPasswordHasher<TUser>实现 IPasswordHasher<TUser> 接口

2.在startup中注入

以上是关于UserManager<TUser>管理用户,如何修改identity默认hash加密算法的主要内容,如果未能解决你的问题,请参考以下文章

在身份 3 中创建声明身份

什么是 ASP.NET Identity 的 IUserSecurityStampStore<TUser> 接口?

Store 未实现 IUserRoleStore<TUser> ASP.NET Core Identity

分页后对 UserManager<T> 进行额外的异步调用

ASP.NET Core 标识不注入 UserManager<ApplicationUser>

ASP.NET Core Identity UserManager<ApplicationUser> -Error 没有为此对象定义无参数构造函数