最近客户有个需求,希望把面向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)的更多相关文章

  1. .NET Web的身份认证

    百度一下”asp.net身份认证“,你会得到很多相关的资料,这些资料通常上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程.初学者对此往往一头雾水,我也曾经被坑过很 ...

  2. ASP.NET Web API教程(六) 安全与身份认证

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  3. [Windows Azure] Adding Sign-On to Your Web Application Using Windows Azure AD

    Adding Sign-On to Your Web Application Using Windows Azure AD 14 out of 19 rated this helpful - Rate ...

  4. Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  5. Azure AD(五)使用多租户应用程序模式让任何 Azure Active Directory 用户登录

    一,引言 距离上次分享关于 “Azure AD" 的知识过去差不多2个多月了, 今天最近刚好也是学习,分享一下关于Azure AD 使用多租户应用程序模式让任何 Azure Active D ...

  6. 如何在ASP.NET Core中实现一个基础的身份认证

    注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ...

  7. [转]如何在ASP.NET Core中实现一个基础的身份认证

    本文转自:http://www.cnblogs.com/onecodeonescript/p/6015512.html 注:本文提到的代码示例下载地址> How to achieve a bas ...

  8. Core身份认证

    Core中实现一个基础的身份认证 注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET ...

  9. [信息安全] 4.一次性密码 && 身份认证三要素

    [信息安全]系列博客:http://www.cnblogs.com/linianhui/category/985957.html 在信息安全领域,一般把Cryptography称为密码,而把Passw ...

随机推荐

  1. pt-tcp-model

    http://blog.9minutesnooze.com/analyzing-http-traffic-tcpdump-perconas-pttcpmodel/ #获取200k个packets tc ...

  2. Linux 性能搜集【linux_reports-cpu/memory/disks/network】

    为方便问题发生后,问题原因的分析排查,我们可以在服务器中事先部署如下脚本,方便故障发生后,问题原因的分析排查 脚本部署方法: 1.将脚本[linux_reports.sh]上传到服务器 2.登陆虚拟机 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(88)-Excel导入和导出-自定义表模导出

    前言 之前说了导入和导出,也提供了自定义的表模的导入,可见LinqToExcel可以做的事情不仅仅如此 这次我们来演示比较复杂的导出Excel,导出复杂的Excel与导入复杂的Excel原理基本是一样 ...

  4. (转载) Java子类与父类之间的对象转换

    在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...

  5. python3.6+linux服务器+django1.11连接MYSQL数据库

    1.django创建一个项目,在项目的settings.py中配置Mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysq ...

  6. js监听浏览器离开页面操作

    序言 大家是否经常遇到在关闭网页的时候,会看到一个确定是否离开当前页面的提示框?想一些在线测试系统.信息录入系统等就经常会有这一些提示,避免用户有意或者无意中关掉了页面,导致数据丢失.这里面的实现过程 ...

  7. Protocol Buffer序列化对比Java序列化.

    初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...

  8. python的简介及入门

    前言 为何使用Python Python 是一种效率极高的语言.与其他众多的语言相比,实现相同功能,使用Python编写的程序包含的代码更少.Python的语法简单,易上手,使用Python编写的代码 ...

  9. Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用

    100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode, ...

  10. 小tip:生成一组不重复的随机数(去重的方法)

    var arr = []; for(var i=0;i<150;i++){ // num为0-100的随机数 var num = Math.round(Math.random()*100); v ...