用Azure AD 實現Web 應用身份認證的Multi-Factor Authentication(MFA)
最近客戶有個需求,希望把面向public的Web應用中的終端用戶數據庫由Azure AD來實現,同時希望可以用MFA來實現用戶身份認證。這個想法非常好,通過使用Azure的managed service AAD,耗時耗力的數據庫運維工作由Azure來完成, 安全管控也同樣由Azure完成,開發只要在代碼中調用相應的AAD SDK並做相應配置就可以實現集成。 可是印象中Azure中國是只支持在portal登錄時候的多重身份驗證(MFA)。那麽問題來了,客戶自己開發的應用能不能用到這個服務呢?比方說,一個外賣app的用戶登錄app時候能不能也在MFA保護之下?三個team的小夥伴一起做research,最後確認Azure中國是支持對和AAD集成的應用提供MFA保障。考慮到客戶都是Java技術棧的,這裏Java sample code演示用Azure AD(AAD) 實現Web 應用身份認證的Multi-Factor Authentication(MFA)的過程。整個流程分為三部分:
- Web應用和AAD集成
- 配置MFA
- AAD的配置
對了,還需要記下訂閱的tenant id。這個大家用powershell或者azure cli登錄一下就知道了
- Web應用的配置
- 在\src\main\webapp\WEB-INF\web.xml裏修改authority(必須如下圖所示),tenant (上文提到的tenant id),client_id(上文提到的應用程序ID),secret_key(上文創建的秘鑰值)的值 。
改動前:
改動後:
2. 在\src\main\java\microsoft\aad\adal4jsample\AadController.java裏修改方法 getUsernamesFromGraph
3. 在\src\main\java\microsoft\aad\adal4jsample\BasciFilter.java裏把“graph.windows.net”修改為“graph.chinacloudapi.cn”
全部完成後打包編譯,mvn package ,把war包部署到本機的tomcat,在browser裏輸入http://localhost:8080/adal4jsample,得到以下頁面
點擊secure page,頁面跳轉到中國的Azure AD做身份鑒權,
輸入用戶名和密碼後登陸Web應用的主頁如下。
配置MFA
接下來我們要做的事情是在Azure AD裏添加web應用的用戶,assign用戶到web應用並且開啟MFA
在註冊了Web應用的AAD 目錄裏添加用戶MFAuser
選擇“Enable Multi-Factor Authentication" 選項,這裏我們還會收到一個臨時的password
進入應用程序頁面中我們上文註冊的Web 應用,把新創建的用戶assign給Web應用
打開瀏覽器,輸入http://localhost:8080/adal4jsample/,頁面跳轉到中國AAD做身份認證,輸入新建的用戶名和臨時密碼,頁面顯示要求配置MFA
AAD MFA可以配置電話,短信,移動device等多種選項,我們選擇Authentication Phone和Send me a code by text message
之後,手機會收到一個來自國外的短消息,用裏面的code就可以完成最後的verify步驟
重新打開瀏覽器,輸入http://localhost:8080/adal4jsample/,頁面跳轉到中國AAD做身份認證,這次只需要給出用戶名,手機會收到驗證碼
輸入驗證碼後,身份驗證成功,登陸系統正常
代碼化的AAD用戶和MFA配置 既然AAD被當做一個Web應用的終端用戶數據庫,那用戶數據的添加,刪除以及MFA的配置這些task需要有一個編程接口來實現 小夥伴試驗了一下,目前只找到了powershell的實現:(。 eg. Import MSONLINE V1的模塊(https://docs.microsoft.com/en-us/powershell/module/msonline/?view=azureadps-1.0)即可實現。代碼如下
Import-Module MSOnline $username=’xxxxxx’ $password=’yyyyyyyy’ $securepassword=Convertto-SecureString –String $password –AsPlainText –force $credentials=New-object System.Management.Automation.PSCredential $username,$securepassword Connect-MsolService –Credential $credentials $users = Get-msoluser -All | where {$_.UserPrincipalName -like ‘*zzzzzz‘} $mfausers = $users | select DisplayName,@{N=‘Email‘;E={$_.UserPrincipalName}},@{N=‘StrongAuthenticationRequirements‘;E={($_.StrongAuthenticationRequirements.State)}} | Sort-Object StrongAuthenticationRequirements $nostrong = $mfausers | Where-Object StrongAuthenticationRequirements -like ‘‘ | Select-Object DisplayName,Email,StrongAuthenticationRequirements $auth = New-Object -TypeName Microsoft.Online.Administration.StrongAuthenticationRequirement $auth.RelyingParty = "*" $auth.State = "Enabled" $auth.RememberDevicesNotIssuedBefore = (Get-Date) $nostrong | Foreach {Set-MsolUser -UserPrincipalName $_.Email -StrongAuthenticationRequirements $auth}
最後提醒一下,電話和短信平臺都在海外,所以都是通話和短消息英語
用Azure AD 實現Web 應用身份認證的Multi-Factor Authentication(MFA)