本文章是由機器翻譯。

Azure 內幕消息

Azure 行動服務的安全性及識別管理

Bruno Terkaly
GregOliver

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 設備上存儲身份驗證權杖的圖 4 高級別步驟
在 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

GregOliver 加入微軟 Azure ISV 組織在 2010 年。 他把他的時間與他們的遷移計畫和實現説明公司大部分。最近,他一直深受消費者遊戲公司競爭的雲供應商從其遷移。加入了微軟,此前他曾在一家創業公司的技術合作夥伴。

感謝以下的微軟技術專家對本文的審閱: Matthew Henderson