此文章由机器翻译。

Azure Insider

通过 Azure 移动服务进行安全和身份管理

Bruno Terkaly
Greg Oliver

Bruno Terkaly 萨提亚 Nadella 清楚地定义了新的微软远景。他说我们生活在一个世界中"移动-­先云。"这并不奇怪。微软一直追求移动和云技术好几年了。该行业正在发生变化和 IT 领导人有机会拥抱带来-你-自己的设备 (BYOD) 革命的压力从来没有更大。

在企业支持 BYOD 勇敢新世界是一个最优先事项。在本文中,我们将帮助您了解如何云计算可以帮助业务线 (LOB) 应用程序开发人员创建和支持苹果 iOS 和谷歌安卓操作系统,Windows Phone 应用程序。我们会解决面临的各种规模的公司的设备管理挑战。我们还将介绍一些低级的本机目标 C 代码,您需要以求妥善管理 OAuth 2.0 令牌从 Azure 移动服务。关键能力保存令牌安全地在移动设备上因此用户并不被迫每次他们想要使用的应用程序日志。

LOB 应用程序的主要特点

有许多问题需要考虑创建 LOB 应用程序时。最重要的内容之一是身份管理 (见图 1)。我们不只谈论用户身份,但也装置的身份。结合这两个因素通常被称为复合身份。这有意义,因为 LOB 应用程序通常具有访问机密的公司资源。

概要 iOS 的业务线应用程序
图 1 概要 iOS 的业务线应用程序

设备管理

有一点是明确约集中化的 IT:它需要执行某种类型的个人设备的控制权。在理想的世界中,它可以强制用户到完全域加入他们的设备。控件的一个不那么极端版本被称为一个工作场所联接,可以被认为是充分加入域的设备轻松版本。

任何 IT 管理员目标应该是确保企业资源和设备本身之间的安全、 加密的通信。安装设备证书作为资源调配过程的一部分是一家公司的一种方式安全地和安全地管理设备。

工作场所资源调配

此资源调配过程的第一个目标是反对一个受信任的目录服务的用户进行身份验证。成功的设备资源调配 (或注册) 结果在该设备上的基于 JSON 的令牌。此标记可以帮助确保用户和企业网络之间的安全通信 (见图 2)。

工作场所资源调配可帮助用户进行身份验证
图 2 工作场所资源调配可帮助用户进行身份验证

分层的身份

思考一系列的安全级别是审慎 (见图 3)。一些企业的信息是简单地更加保密的。经常需要额外的措施保护那些格外敏感的数据。

安全级别的谱
图 3 安全级别的谱

我们大多数人都已经熟悉用户身份验证。在这最基本的安全级别,用户登录使用其用户名和密码。第二个层次是设备的身份验证,可能执行一种多因素身份验证方法。通过结合用户标识和设备标识 (例如使用 SMS 挑战),又可以组成一个复合的身份。

网络位置感知

个人设备上运行应用程序时的另一个重要问题是网络位置知晓 (NLA)。这意味着当一个请求进来为受保护的网络资源,您可以确定是否该请求源自企业网络外部的。NLA 提供额外的保护层,因为它有助于执行额外的规则,如企业网络外部的生成请求的多因素身份验证。

实施网络位置透明度通常意味着您在 DMZ 中创建某种代理 Web 服务。DMZ 是公开到大和不受信任的网络,像互联网一样的组织面向外部的服务网络。这些代理服务器可用于触发其他规则和隔离从外部访问网络上的私人资源。微软已启用这些方案的具体技术。了解更多关于他们在 bit.ly/1v50JPq

支持本机 ios 代码的标识

我们将展示一些低级的技术,利用本机 iOS 功能。到那之前,然而,我们将提供一些周围 Azure 移动服务的内容。蔚蓝的移动服务提供几个通常所需的能力,对客户端程序。客户端程序可以是本机的 iOS,Android、 Windows Phone,浏览器-­基于 HTML/JavaScript 或窗口。

任何客户端平台,可以调用一个 REST API 可以利用 Azure 移动服务。它提供了不同级别的库支持跨这些支持的客户端。其他功能包括联合的身份,访问存储,脱机数据同步和推送通知。在后端,前端的其他人中实现一些功能。并且你可以使用 Microsoft.NET 框架或 Node.js 作为后端。

实施更具挑战性的功能之一在 iOS 设备上存储一个安全令牌。该令牌最初由 Azure 移动服务提供。操作系统需要保护令牌,它需要进行加密。幸运的是,钥匙串机制纳入 iOS SDK 提供了此功能。它让您可以安全地将令牌存储员工的设备上。这是一个纯本机方法,意味着代码并不真正可重用。

有存储安全令牌在本地设备上的优势。最重要的是它可以让用户无需在每次登录访问该应用程序。移动服务个 azure 应用程序可以利用任何或所有的几个安全令牌提供程序或身份提供商如 Active Directory,Azure Active Directory、 Facebook、 Twitter 和其他。每一个提供基本身份验证,但是他们是唯一以其他的方式。

他们是不同的一种方法是到期令牌的能力。活动目录和 Azure Active Directory 允许这一点,但 Twitter 并不。到期令牌这个能力是访问的重要的授予访问公司资源,因此,Active Directory 和 Azure Active Directory 最终更好的选择,这种级别比 Twitter 的身份验证。

本着"开始很简单",我们将描述的过程,在这篇文章,使用 Twitter 的身份验证,然后涵盖 Azure Active Directory 在以后的文章。Xcode 是 IDE 用于开发 iOS 应用程序。它是某种程度上类似于 Visual Studio 中,但不太复杂化,并能。IOS 应用程序的代码的传统语言为目的。

为了说明这些技术,从开始处的教程 bit.ly/1vcxHMQ。添加联合身份验证利用 Twitter 的身份提供程序服务。本教程包括后端和前端模块。您可以选择任何后端 (.NET 或 JavaScript),如你跟随。采取目标 C 通路的前端。我们会借一些代码从另一个样例项目 (iOS LensRocket) 在 GitHub 对钥匙扣功能的支持。

不是很多的变化需要到 Azure 移动服务所提供的前端 Xcode 项目。我们需要做的就是从 security.framework 库添加钥匙串代码和安全功能。当用户启动应用程序时,应用基本的令牌管理逻辑。应用程序启动时检查令牌通过成串 API 调用。如果令牌是存在的它具有检索和使用。不会要求用户重新登录到 Twitter。

这里是的我们会在 Xcode IDE 中的代码更改的摘要:

  • 链接到附加的库 (找到更多的指导,在 bit.ly/1x7Ajzz)
  • 从 iOS LensRocket 以支持钥匙扣功能添加几个文件
  • 修改控制器代码

图 4 演示如何我们将使用 Azure 移动服务和本机 iOS 代码来控制对使用令牌缓存在该设备上的 SQL 数据库访问。

在 iOS 设备上存储身份验证令牌的高级别步骤
在 iOS 设备上存储身份验证令牌的图 4 高级别步骤

本教程将让你到运行本机的 iOS 应用程序可以读取和写入 SQL 数据库在云中托管的点。你得写在目的 C.Xcode 项目工作 然而,它缺少身份验证 — — 我们稍后会作出解释。现有的实现使用 Azure 移动服务所提供的应用程序键:

// Initialize the Mobile Services client with your URL and key.
MSClient *client =
  [MSClient clientWithApplicationURLString:@"https://msdnmagazine.azure-mobile.net/"
applicationKey:@"cctyYudYfxuczeRDMPcDBRCxDrOUIM73"];

对这种做法的关注是显而易见的。只要你把秘密嵌入您的应用程序代码,你自己暴露在安全风险。我们真的想要做的是强制用户进行登录,以便执行数据库更新。然而,我们不希望用户必须登录不断,所以我们想在本地设备上存储的身份验证令牌。我们将配置 iOS 应用程序来启动应用程序时检索令牌。

大多数的企业场景不会拥抱社会基于的身份的供应商,如 Facebook 或者 Twitter。然而,它是一个有用的地方,开始因为我们可以表现出一些后来利用房地上身份与 Active Directory 的核心概念。而且在此基础上,很多业务应用程序利用关系数据库,Azure 移动服务提供了预构建的功能,以支持他们。

把事情开始,你得做一些基本的任务,在 Azure 管理门户网站和第三方身份提供程序 (这在这种情况下是 Twitter)。在 Azure 移动服务门户中创建应用程序元数据在 twitter 上门户网站和相关的应用程序元数据。然后获取应用程序的 URL。将应用程序的 URL 复制到 Twitter 并将 Twitter API 密钥复制到 Azure 移动服务。这是你如何绑定身份标识提供程序到 Azure 移动服务应用程序 (请参阅图 5)。

蔚蓝的移动服务与 Twitter 之间的关系
图 5 蔚蓝的移动服务与 Twitter 之间的关系

这实质上是在门户中下面的步骤创建移动应用程序元数据:

  1. 获取 URL 从 Azure 管理门户创建的移动应用程序
  2. 登录并转到 dev.twitter.com/apps/new
  3. 创建一个新的 Twitter 应用程序
  4. 获取您的 Twitter 应用程序的 API 密钥和 API 的秘密
  5. 返回到 Azure 的管理门户
  6. 在 API 密钥和 API Secret 从 Twitter 中的粘贴

门户的工作

正如前面提到的有对夫妇的建立您的后端的方法。如果您选择.NET 框架,你得很好的控制 Web API 中在使用案例授权对于所有用户,无论他们通过身份验证或者不。如果你选择了 Node.js,门户提供了声明和使用脚本的方法。

我们真正需要做的是回到 Xcode IDE 运行在 mac 上我们将使用它来编辑和编译将在移动设备运行的 LOB iOS 应用程序的源代码。

我们会在 Xcode IDE 中了以下代码更改:

  • 添加到 security.framework 的库引用。
  • 将这四个文件复制从 iOS LensRocket 在 bit.ly/1pqvQ25
    • KeyChainWrapper.h
    • KeyChainWrapper.m
    • LensRocketConstants.h
    • LensRocketConstants.m

有三个关键函数/方法。第一个是 viewDidLoad,在那里我们添加了对 loadAuthInfo 的调用。这将加载到内存以前保存的令牌从早些时候的成功登录。这里,我们会有从磁盘而不是强迫用户重新登录加载该令牌 (见图 6)。

图 6 到本机 iOS 代码进行的更改

#import "KeychainWrapper.h"  // Add this line.
- (void)viewDidLoad
{
  // Code omitted for brevity.
  [self loadAuthInfo];  // Add this line.
}
// Code omitted for brevity.
////////////////////////////////////////////////////////////////////////////////
//   Added viewDidAppear(), loadAuthInfo() below.
////////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// Event is viewDidAppear. When app becomes active, check credentials.
//
- (void)viewDidAppear:(BOOL)animated
{
  ////////////////////////////////////////////////////////////////////////////
  //  Check if current user is logged in. If not, log in to Twitter.
  MSClient *client = self.todoService.client;
  if(client.currentUser != nil)   {
    return;
  }
  [client loginWithProvider:@"twitter" controller:self animated:YES
    completion:^(MSUser *user, NSError *error) {
    [self saveAuthInfo];
    [self refresh];
  }];
}
// ----------------------------------------------------------------------------
// Save token locally.
// Leverage built-in iOS features called Keychain for user ID and tokenl storage
//
- (void) saveAuthInfo{
  // Save the userId
  [KeychainWrapper createKeychainValue:self.todoService.client.currentUser.userId
    forIdentifier:@"userid"];
  // Save the token itself
  [KeychainWrapper
    createKeychainValue:self.todoService.client.currentUser.
      mobileServiceAuthenticationToken
  forIdentifier:@"token"];
}
// ----------------------------------------------------------------------------
// Load the user ID and Token from the keychain. Avoid forcing user to log in again.
//
- (void)loadAuthInfo {
  NSString *userid =
    [KeychainWrapper keychainStringFromMatchingIdentifier:@"userid"];
  if (userid) {
    // Fetch the user ID and token from the Keychain.
    NSLog(@"userid: %@", userid);
    self.todoService.client.currentUser = [[MSUser alloc] initWithUserId:userid];
    self.todoService.client.currentUser.mobileServiceAuthenticationToken =
      [KeychainWrapper keychainStringFromMatchingIdentifier:@"token"];
  }
}

我们还添加了 viewDidAppear 函数,调用时应用程序变得可见或活动。我们使用 MSClient 对象来检查,看看是否在用户登录。 如果用户没有登录,我们力推的登录名,然后保存的凭据 (token) 磁盘使用钥匙扣功能。这更适当地将执行 viewDidLoad。

SaveAuthInfo 和 loadAuthInfo 的方法简单地使用钥匙串代码保存和加载的标记,从移动设备上的磁盘。你可以阅读更多关于钥匙扣处 bit.ly/1qqcNFm

您可以按照第二个教程上执行身份验证在 bit.ly/1B3Av0k。你会遵循类似的过程,以便联邦到 Azure Active Directory,而不是推特:

  1. 获取 URL 从 Azure 管理门户创建的移动应用程序
  2. 转到你的 Active Directory 网页 (也在 Azure 管理门户)
  3. 创建一个新的应用程序
  4. 获取客户端 ID 和密钥
  5. 返回到移动应用程序页在 Azure 管理门户
  6. 在客户端 ID 和密钥从 Active Directory 中粘贴

我们将进入周围联盟对 Active Directory 的处所和 Azure 的 Active Directory 中云将来的文章中的更多细节。在此期间,你可以看到在一些伟大的代码样本 bit.ly/1slQMz2bit.ly/1mK1LQF

总结

支持在工作场所的个人设备的压力不断增加,是重要的开发人员能够更好地了解如何保护这些设备和使用令牌的工作。执行身份验证的用户名/密码方法往往是不够的真正机密数据的。

要充分利用设备上的所有安全功能,你会经常需要访问本机功能,看作与 iOS 的钥匙串服务。在即将发表的文章,我们将继续探索的挑战,面对它周围移动设备在企业中,领导人注重身份、 数据同步和推式通知。

Bruno Terkaly 是微软的开发人员福音传教士。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、SDK、库和 API 编写代码的经验。他花时间写代码、 博客和直播演讲上构建基于云的应用程序,具体地使用微软 Azure 平台。你可以读他的博客 blogs.msdn.com/b/brunoterkaly

Greg Oliver 加入微软 Azure ISV 组织在 2010 年。 他把他的时间与他们的迁移计划和实现帮助公司大部分。最近,他一直深受消费者游戏公司竞争的云提供商从其迁移。加入了微软,此前他曾在一家创业公司的技术合作伙伴。

衷心感谢以下 Microsoft 技术专家对本文的审阅: Matthew Henderson


Bruno Terkaly是 Microsoft 的开发推广人员。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、SDK、库和 API 编写代码的经验。他花时间写代码、 博客和直播演讲上构建基于云的应用程序,具体地使用微软 Azure 平台。您可以阅读他的博客 blogs.msdn.com/b/brunoterkaly

Greg Oliver 加入微软 Azure ISV 组织在 2010 年。 他把他的时间与他们的迁移计划和实现帮助公司大部分。最近,他一直深受消费者游戏公司竞争的云提供商从其迁移。加入了微软,此前他曾在一家创业公司的技术合作伙伴。

衷心感谢以下 Microsoft 技术专家对本文的审阅: Matthew Henderson