一、背景
由於項目突然進行的護網行動,要求在登錄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、增加多重身份驗證方法