用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)的過程。整個流程分爲三部分:java

  • 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登陸一下就知道了git

 

  • 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(上文建立的祕鑰值)的值 。

改動前:github

 

改動後:web

 

  2. 在\src\main\java\microsoft\aad\adal4jsample\AadController.java裏修改方法 getUsernamesFromGraphshell

 

  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作身份鑑權,windows

輸入用戶名和密碼後登錄Web應用的主頁以下。api

 

 

配置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}

 

 最後提醒一下,電話和短信平臺都在海外,因此都是通話和短消息英語

相關文章
相關標籤/搜索