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
七、增長多重身份驗證方法