移动服务和 Azure Active Directory 中基于角色的访问控制

编辑人员注释:本文章由 Matthew Henderson 撰写

去年 11 月,我们发布了 Azure Active Directory (AAD) 预览版作为移动服务身份提供程序。此举旨在为企业开发人员提供简单易用的解决方案,以构建面向员工的移动应用程序。作为起点,使用基本身份验证是一个很好的选择。但在很多情况下,目前的预览版客户需要对各种类型的用户加以区分,以便做出适当的授权决定。基于角色的访问控制 (RBAC) 的思路是为用户可以担任的角色分配权限,从而恰当定义界限来限定某类用户可以执行和不可执行的操作。幸运的是,向 Azure 移动服务添加基本 RBAC 功能非常简单。本文将为您演示如何实现这一点。

要继续阅读本文后面的内容,您需要注册移动服务预览版以进行 Azure Active Directory 集成。如果您想注册,请发送电子邮件至 MobileServices@microsoft.com

背景

假设我想开发一个仅供销售团队使用的应用程序。要访问该应用程序,用户不仅必须是公司目录中的成员,而且要被分配到销售组。下面我们来看看,为了确保只有经过身份验证的销售团队成员才能访问该应用程序,需要在服务器端添加什么逻辑。(如果您刚刚开始在移动服务中使用 Azure Active Directory 身份验证,您会发现该入门教程很有帮助。)

我们将采用的基本方法是利用 Azure AD 租户中用户的安全组成员身份。AAD 同时具有角色和组的概念,但在今天的方案中,我们使用的是一个已拥有正确用户成员身份的现有组。我们将通过一个已与 Azure AD 租户同步的内部部署 AD 租户来管理这个组。使用 O365 和 Windows Intune 的客户已经证实,通过设置和内部部署 Active Directory 目录的同步,将使您拥有强大功能(您甚至可以使用这些租户构建移动服务)。

今天,我要使用的是“密码同步”选项,但实际上支持的方案有很多种。事实上,您可以将 AAD 设置为指向 ADFS,以支持大型混合方案。如果要尝试这些选项,可启动运行 Windows Server 2012 R2 Datacenter 的 Azure VM 并安装 Active Directory 域服务角色,然后按照目录同步说明进行操作。

创建组

您可以看到,我已在自己的目录中创建了一些用户(Alice、Bob、Carol 和 Dave)和一个“Sales”域安全组。Alice 和 Bob 已经是该组的成员,但 Carol 和 Dave 尚未加入该组,因此应该没有权限访问我的应用程序。其他一切均为默认值。

连接到 Azure 移动服务

现在,我已准备好开始构建我的应用程序后端。在 Azure 移动服务中,我们希望在已提供的机制之上使用附加的授权逻辑来保护每个脚本和 API。为了进一步增强安全性,我将每个受保护端点的权限设置为“Only Authenticated Users”。

我希望所构建的逻辑能够在多个脚本中执行,因此我将代码放在移动服务的 Git 存储库的共享脚本部分。我将脚本命名为 rbac.js。

要确定组成员身份,第一步需要获得对 AAD graph API 的访问权限。此博客文章此示例介绍了如何进行此设置。您可从下面的代码段开始:

获得graph访问令牌后,我们需要调用 isMemberOf graph端点。此操作将检查指定的用户是否是某个给定组的成员,包括可传递的成员身份。我们可从所检查的脚本中获取用户 ID - 所有表脚本会显式接收用户对象,而您可以通过访问 request.user 从自定义 API 获得一个用户对象。另外,我们需要获取一个组 ID,该 ID 可以在管理门户中方便地获得。您可以转到 Azure AD 租户,打开组选项卡并选择组,然后从 CONFIGURE 选项卡中复制 OBJECT ID。

为了便于使用,我们使用一个好记的名称从共享脚本中导出该值。

接下来,我们要编写一个函数来包装对 AAD isMemberOf 端点的调用。如前所述,我们需要刚才获得的用户 ID (userID) 和组 ID (groupID)。请求中还需要包含之前获得的访问令牌。

接下来,我们要稍微简化一下编程模型,只需要移动服务的用户对象(通过它可以获得 objectID)和组 ID 即可。然后正确对其进行包装,以获得graph令牌并进行调用。请注意,在实际应用中,您可以选择缓存该令牌,而不必每次都提取。该令牌包含一个到期值,通过它可以判断何时应提取新的令牌。

对于共享脚本,需要做的就是这些。接下来,对于要使用 RBAC 保护的每个脚本,我只需添加几行代码,然后在回调中执行脚本的工作即可。下面是表读取操作的一个示例:

总结

大功告成了。我们已成功限制只有部分有需要的员工才可以使用该应用程序。现在,您可以开始构建各种 RBAC 方案。如果您需要将某些用户的客户端 UI 与其他用户区别开来,一个简单的实现方法是将成员身份检查公布为自定义 API,您可在用户登录后立即执行此检查。

Azure Active Directory 正在利用组支持实现一些很棒的功能,并且很多可以直接在管理门户中完成。AAD 高级版用户应深入了解全新的自助服务组管理支持

如果您对企业移动应用程序开发感兴趣,建议同时了解一下全新的移动服务 .NET 后端预览版。该预览版目前尚未内置 AAD 支持,但是不用担心,我们很快便会提供此项支持。

另外再次提醒,如果您对 AAD 预览版感兴趣或者有任何疑问,请发送电子邮件与我们联系:mobileservices@microsoft.com

如果您希望我们介绍一些其他的功能或方案,请将反馈意见提交至我们的 uservoice 网站。

本文翻译自:

https://blogs.msdn.com/b/windowsazure/archive/2014/03/11/roles-based-access-control-in-mobile-services-and-azure-active-directory.aspx