一、背景
由于项目突然进行的护网行动,要求在登录CRM时再加一层服务器端的验证。
二、解决方案
利用ADFS多重身份验证机制,自定义验证策略,实现账号密码登录后,自动发送短信验证至用户手机,并进行验证。(如果没有短信发送接口,可以进行邮箱验证!)
三、实现过程
1、创建一个面向 .NET 4.5 .NET Framework的类库
2、添加引用-->Microsoft.IdentityServer.Web.dll,文件位于ADFS服务器的下图所示文件夹.
3、编写代码(详情见附件)
a.创建三个类别继承接口:IAuthenticationAdapter、IAuthenticationAdapterMetadata、IAdapterPresentationForm
b.注意编写继承IAdapterPresentationForm类的时候,需要新增资源文件,用户编写自定义验证页面:例如附件中的CustomPage.txt
c.注意附件中的WebApiUrlConfig.json文件,用户配置接口地址,需要注册至ADFS(注册方法见 5、注册身份验证提供者至ADFS服务器)
4、注册程序集至ADSF服务器的GAC中
a.增加签名
b.由于ADFS服务器中没有安装.net的框架,所以需要从本地拷一份gacutil工具至ADFS服务器
下图示例为windows10中的工具位置,将文件夹拷贝至ADFS服务器
c.将编译好的dll拷贝至ADFS服务器的gacutil.exe同一目录下
d.打开管理员:命令提示符,执行下图命令
gacutil /if .RekTec.Crm.AdfsCaptcha.dll -- 添加程序集至缓存
gacutil /l RekTec.Crm.AdfsCaptcha -- 查询程序集详情
5、注册身份验证提供者至ADFS服务器
Register-AdfsAuthenticationProvider –TypeName "RekTec.Crm.AdfsCaptcha.MFAadapter.CustomAuthenticationAdapter,RekTec.Crm.AdfsCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=090b4b325acf4ab5, processorArchitecture=MSIL" –Name "RtMFAProvider" -ConfigurationFilePath "WebApiUrlConfig.json"
蓝色字体:上图查询出的程序集详细信息。
绿色字体:自定义名称
黄色字体:接口配置文件(注意需要将附件中的配置文件放置 ADFS服务器,例如c:soft)
注册完成后,重启ADFS服务器:net stop adfssrv net start adfssrv
power shell -> Get-AdfsGlobalAuthenticationPolicy 查询上面注册的身份验证策略
6、打开ADFS管理器,增加多重身份验证方法(RekTec MFA 短息验证码)
7、更改信任放访问控制策略(这个需要在添加 信赖发信任 进行访问控制策略配置)
8、测试
a.输入正确的账号密码,点击登录
b.输入手机验证码,点击验证,登陆成功
四、更新dll操作
1、取消多重身份验证方法
2、撤消注册提供程序
// 删除AdfsAuthenticationProvider
Unregister-AdfsAuthenticationProvider –Name "RtMFAProvider"
3、从 GAC 中删除程序集
// 先根据程序集名称查询详情,后删除
gacutil /l RekTec.Crm.AdfsCaptcha
gacutil /u “RekTec.Crm.AdfsCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=090b4b325acf4ab5, processorArchitecture=MSIL”
4、重新注册更新后程序集至GAC
gacutil /if .RekTec.Crm.AdfsCaptcha.dll
5、重新注册提供程序(用PowerShell执行,注意:因为由于缓存的存在,每次更新完GAC程序集后,请重新打开PowerShell!)
Register-AdfsAuthenticationProvider –TypeName "RekTec.Crm.AdfsCaptcha.MFAadapter.CustomAuthenticationAdapter,RekTec.Crm.AdfsCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=090b4b325acf4ab5, processorArchitecture=MSIL" –Name "RtMFAProvider"
6、重新启动ADFS服务
net stop adfssrv
net start adfssrv
7、增加多重身份验证方法