1. 程式人生 > >用Azure AD 實現Web 應用身份認證的Multi-Factor Authentication(MFA)

用Azure AD 實現Web 應用身份認證的Multi-Factor Authentication(MFA)

數據庫 users 訂閱 還需 打包 源代碼 user .cn host

最近客戶有個需求,希望把面向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
Note: 關於Oauth2.0和OpenID Connect的授權鑒權流程,可以參考以下link: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-openid-connect-code Web應用和AAD集成
  • AAD的配置
  首先我們需要一個AAD的管理員賬戶並且登錄Azure Portal,在左邊的服務菜單欄選定 “Azure Active Directory”。 技術分享圖片   接下來在AAD註冊我們的Web應用.這是一個部署在本地電腦上的Web應用,登錄url是http://localhost:8080/adal4jsample/。 點擊“新應用程序註冊”,輸入以下信息並點擊創建 技術分享圖片
技術分享圖片   創建成功後需要把註冊好的的應用程序 ID記錄下來,在接下來的應用程序的配置裏需要使用這個ID,另外“需要使用用戶分配”這個選項記得要選“是” 技術分享圖片   此外,還需要設置 回復url,這個url也可以由Web應用的開發提供 技術分享圖片 還需要配置啟用訪問權限 技術分享圖片 最後要配置一個秘鑰 (添加秘鑰的時候必須記錄下秘鑰值,不然之後再回到頁面秘鑰值就被隱藏起來) 技術分享圖片

對了,還需要記下訂閱的tenant id。這個大家用powershell或者azure cli登錄一下就知道了

  • Web應用的配置
   集成AAD的代碼(示範代碼可以從以下url下載 https://github.com/Azure-Samples/active-directory-java-webapp-openidconnect//archive/complete.zip)使用了Java 庫 ADAL4J,這個庫用來實現發送SignIn/SignOut的request,管理用戶 session,獲取用戶信息,源代碼可以https://github.com/AzureAD/azure-activedirectory-library-for-java獲取。 在這個示範代碼裏所需的改動如下:
  1. 在\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)