最近客户有个需求,希望把面向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做身份认证,这次只需要给出用户名,手机会收到验证码
输入验证码后,身份验证成功,登陆系统正常
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}
最后提醒一下,电话和短信平台都在海外,所以都是通话和短消息英语