• 用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
    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. 在srcmainwebappWEB-INFweb.xml里修改authority(必须如下图所示),tenant (上文提到的tenant id),client_id(上文提到的应用程序ID),secret_key(上文创建的秘钥值)的值 。

    改动前:

     

    改动后:

      2. 在srcmainjavamicrosoftaadadal4jsampleAadController.java里修改方法 getUsernamesFromGraph

      3. 在srcmainjavamicrosoftaadadal4jsampleBasciFilter.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}

     最后提醒一下,电话和短信平台都在海外,所以都是通话和短消息英语

     
     
           
  • 相关阅读:
    .NET使用ICSharpCode.SharpZipLib压缩/解压文件
    在vs2005中使用AnkhSvn服务端IP改变无法连接
    repeater标签双重循环的使用
    在vs2005中使用SVN进行版本管理
    jmeter--响应断言
    jmeter--十三种断言方式介绍
    jmeter--参数化的四种方法
    jmeter--元件的作用域与执行顺序
    jmeter--使用badboy录制脚本
    jmeter--基本组件介绍
  • 原文地址:https://www.cnblogs.com/meowmeow/p/8087229.html
Copyright © 2020-2023  润新知