1、背景git
因为项目忽然进行的护网行动,要求在登陆CRM时再加一层服务器端的验证。github
2、解决方案shell
利用ADFS多重身份验证机制,自定义验证策略,实现帐号密码登陆后,自动发送短信验证至用户手机,并进行验证。(若是没有短信发送接口,能够进行邮箱验证!)json
3、实现过程windows
一、建立一个面向 .NET 4.5 .NET Framework的类库缓存
二、添加引用-->Microsoft.IdentityServer.Web.dll,文件位于ADFS服务器的下图所示文件夹.服务器
三、编写代码(详情见附件)框架
a.建立三个类别继承接口:IAuthenticationAdapter、IAuthenticationAdapterMetadata、IAdapterPresentationFormide
b.注意编写继承IAdapterPresentationForm类的时候,须要新增资源文件,用户编写自定义验证页面:例如附件中的CustomPage.txt工具
c.注意附件中的WebApiUrlConfig.json文件,用户配置接口地址,须要注册至ADFS(注册方法见 五、注册身份验证提供者至ADFS服务器)
四、注册程序集至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 -- 查询程序集详情
五、注册身份验证提供者至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 查询上面注册的身份验证策略
六、打开ADFS管理器,增长多重身份验证方法(RekTec MFA 短息验证码)
七、更改信任放访问控制策略(这个须要在添加 信赖发信任 进行访问控制策略配置)
八、测试
a.输入正确的帐号密码,点击登陆
b.输入手机验证码,点击验证,登录成功
4、更新dll操做
一、取消多重身份验证方法
二、撤消注册提供程序
// 删除AdfsAuthenticationProvider
Unregister-AdfsAuthenticationProvider –Name "RtMFAProvider"
三、从 GAC 中删除程序集
// 先根据程序集名称查询详情,后删除
gacutil /l RekTec.Crm.AdfsCaptcha
gacutil /u “RekTec.Crm.AdfsCaptcha, Version=1.0.0.0, Culture=neutral, PublicKeyToken=090b4b325acf4ab5, processorArchitecture=MSIL”
四、从新注册更新后程序集至GAC
gacutil /if .\RekTec.Crm.AdfsCaptcha.dll
五、从新注册提供程序(用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"
六、从新启动ADFS服务
net stop adfssrv
net start adfssrv
七、增长多重身份验证方法