相信了解MS身份认证系统的人一定知道UserManager的角色,他是整个系统中的调度者。他定义了一组用户行为来帮助我们管理用户信息、角色信息和处理密码。当它的实现在UserStore中时,我们可以实现它的定义,如iuser store、iuserpasswordstore、irolestore等。我们可以根据一整套用户行为,定制自己的用户信息和数据结构以及数据存储。然后,关于密码散列器,微软仍然为我们提供了一个完整的行为定义,这个定义也是由用户管理器调度的。例如
用户管理器。密码哈希器. HashPassword(密码)
密码哈希在用户管理器界面中的定义如下:
最初,我对它的默认实现不感兴趣。为了多个应用程序的独立登录身份验证,需要一个独立的用户身份验证项目作为身份验证服务,它只产生令牌。身份验证成功后,用户的HTTP请求头的授权需要令牌来访问应用服务器上的各种资源。
因此,在多个应用程序的密码验证中存在这样一个问题:
比如应用A采用实现IPasswordHasher的形式定制加密方式——MD5 salt,应用B采用Identity默认PasswordHasher,通过反编译得到如下代码:
因此,为了兼容多个应用的不同加密方式,我不得不反编译源代码,得到其默认的加密方式,根据不同的应用名称判断是加密还是解密密码,或者直接将数据库与用户输入的密码进行某种方式的比较。首先,实现微软的默认密码哈希器
//用喷气大脑反编译程序进行反编译//:型Microsoft.AspNet.Identity.Crypto//组件:微软. AspNet。身份核心,版本=2.0.0.0,区域性=中性,公钥令牌=31bf 3856 ad 364 e 35//mvid : E3 a10 ffd-023 a-4 bc3-AD53-32d 145 abf1c 9//程序集位置: c : Sport 新项目 v 2.0 Api 幻想.运动包微软. AspNet。身份。核心。2 .2 .1 lib net 45 Microsoft .身份识别系统;使用系统。运行时编译服务;使用系统。安全。密码学;命名空间微软.AspNet。身份{内部静态类crypto { private const int PBKDF2IterCount=1000;private const int pbkdf 2 SubKeyLength=32;private const int SaltSize=16公共静态字符串HashPassword(字符串密码){ if(密码==null)抛出新的ArgumentNullException('密码');byte[]salt;字节[]字节;使用(RFC 2898 derivebytes RFC 2898 derive bytes=新RFC 2898 derive bytes(密码,16,1000)) { salt=rfc2898DeriveBytes .盐;字节=rfc2898DeriveBytes .GetBytes(32);} byte[]InRay=new byte[49];缓冲BlockCopy((Array) salt,0,(Array) inArray,1,16);缓冲块复制((数组)字节,0,(数组)inArray,17,32);返回转换.到base64字符串(InRay);}公共静态bool VerifyHashedPassword(字符串哈希密码,字符串密码){ if(hashedPassword==null)返回falseif(密码==null)抛出新的ArgumentNullException('密码');字节[] numArray=转换.来自base64字符串(HashedPassword);if (numArray .长度!=49 || (int) numArray[0]!=0)返回falsebyte[] salt=新字节[16];缓冲BlockCopy((Array) numArray,1,(Array) salt,0,16);字节[] a=新字节[32];缓冲块复制((数组)17岁的努马雷数组)a,0,32);字节[]字节;使用(RFC 2898 derivebytes RFC 2898 derive bytes=新RFC 2898 derive bytes(密码,盐,1000))字节=rfc2898DeriveBytes .GetBytes(32);返回加密bytearraysqueal,字节);}[方法mpl(方法mploptions .不优化])私有静态bool ByteArraysEqual(字节[] a,字节[] b) { if (object .(对象(a)、(对象(b))返回trueif (a==null || b==null || a .长度!长度)返回假声标志=真;for(int index=0;指数a。长度;索引)标志=(int)a[index]==(int)b[index];返回标志;} }}有人可能会问,拿到了这些源码要如何应用呢。下面就是浅述到这个问题。
一开始我天真的认为,不就是一个加密么,不用仔细看了,拿来用就好了?
在注册用户和修改密码的时候,都是通过上面HashPassword方法来做的密码加密,那我在新的自定义密码散列器中,为应用B对比用户登录密码的时候,把用户输入直接通过HashPassword加密一边不就好了?所以我自定义的验证哈希密码(验证译为核实)方法,就是比较数据库中的Pwd和经过厨师处理的结果是否相等。可结果是,每次相同的字符串,会产生不同的加密结果,和以前玩讯息摘要5盐不一样呀。所以我又想到了其默认实现的验证哈希密码方法。
所以最后要说的就是你可以拿来微软身份的加密方式(上面的哈希)直接使用,在比较用户输入和数据库中已经经过混杂的存储结果进行对比的时候,使用其VerifyHashedPassword()方法。即使不使用身份认证也可以用此加密算法
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!