微软CRM 基于 ADFS自定义多重身份验证

一、背景

由于项目突然进行的护网行动,要求在登录CRM时再加一层服务器端的验证。

二、解决方案

利用ADFS多重身份验证机制,自定义验证策略,实现账号密码登录后,自动发送短信验证至用户手机,并进行验证。(如果没有短信发送接口,可以进行邮箱验证!)

三、实现过程

1、创建一个面向 .NET 4.5 .NET Framework的类库

微软CRM 基于 ADFS自定义多重身份验证

2、添加引用-->Microsoft.IdentityServer.Web.dll,文件位于ADFS服务器的下图所示文件夹.

微软CRM 基于 ADFS自定义多重身份验证

微软CRM 基于 ADFS自定义多重身份验证

3、编写代码(详情见附件)

a.创建三个类别继承接口:IAuthenticationAdapter、IAuthenticationAdapterMetadata、IAdapterPresentationForm

b.注意编写继承IAdapterPresentationForm类的时候,需要新增资源文件,用户编写自定义验证页面:例如附件中的CustomPage.txt

微软CRM 基于 ADFS自定义多重身份验证

微软CRM 基于 ADFS自定义多重身份验证

c.注意附件中的WebApiUrlConfig.json文件,用户配置接口地址,需要注册至ADFS(注册方法见 5、注册身份验证提供者至ADFS服务器)

4、注册程序集至ADSF服务器的GAC中

a.增加签名

微软CRM 基于 ADFS自定义多重身份验证

b.由于ADFS服务器中没有安装.net的框架,所以需要从本地拷一份gacutil工具至ADFS服务器

下图示例为windows10中的工具位置,将文件夹拷贝至ADFS服务器

微软CRM 基于 ADFS自定义多重身份验证

c.将编译好的dll拷贝至ADFS服务器的gacutil.exe同一目录下

微软CRM 基于 ADFS自定义多重身份验证

d.打开管理员:命令提示符,执行下图命令

gacutil /if .RekTec.Crm.AdfsCaptcha.dll -- 添加程序集至缓存

gacutil /l RekTec.Crm.AdfsCaptcha        --  查询程序集详情

微软CRM 基于 ADFS自定义多重身份验证

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

微软CRM 基于 ADFS自定义多重身份验证

power shell -> Get-AdfsGlobalAuthenticationPolicy 查询上面注册的身份验证策略

微软CRM 基于 ADFS自定义多重身份验证

6、打开ADFS管理器,增加多重身份验证方法(RekTec MFA 短息验证码)

微软CRM 基于 ADFS自定义多重身份验证

7、更改信任放访问控制策略(这个需要在添加 信赖发信任 进行访问控制策略配置)

微软CRM 基于 ADFS自定义多重身份验证

微软CRM 基于 ADFS自定义多重身份验证

8、测试

a.输入正确的账号密码,点击登录

微软CRM 基于 ADFS自定义多重身份验证

b.输入手机验证码,点击验证,登陆成功

微软CRM 基于 ADFS自定义多重身份验证

微软CRM 基于 ADFS自定义多重身份验证

 微软CRM 基于 ADFS自定义多重身份验证

四、更新dll操作

1、取消多重身份验证方法

微软CRM 基于 ADFS自定义多重身份验证

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、增加多重身份验证方法

微软CRM 基于 ADFS自定义多重身份验证

 代码地址:https://github.com/SkyQAQ/ADFS_MFA