2015年7月22日

透過Azure AD驗證Azure Service Management REST API呼叫

Microsoft Azure提供了各種管理服務的機制,除了透過Portal,也可以透過PowershellXPlat-CLIPython SDK等等;而這所有的工具,底層最終都是透過呼叫AzureREST APIAzure管理機制溝通達到管理的目的。
Azure目前有兩種管理的APIAzure Resource Manager APIAzure Service Management API;兩者都允許我們管理與瀏覽各項服務,而呼叫這兩種API時,都必須通過驗證。
Azure Service Management API提供了透過Client Certificate的驗證以及Azure Active Directory驗證兩種機制;而呼叫Resource Manager API時則必須透過Azure AD作為驗證機制。
本文會以範例說明如何透過.Net呼叫Azure Service Management API,並以Azure Active Directory使用者的帳號密碼作為身分驗證機制。

在開始之前需要注意,所有的訂閱都必定會有一個預設的AAD;所有的訂閱都需要與一個AAD關聯。預設來說,你的訂閱會與預設的AAD關聯;但是你也可以建立新的AAD,並將你的訂閱與新的AAD關聯。而為了要讓程式可以透過使用者帳號密碼呼叫API存取資源,我們所建立的使用者必須是與訂閱關聯的AAD中的使用者。
l   在我的例子中,我總共有三個AAD
l   我的訂閱是與MichaelChi.Net這個AAD關聯
l   首先,為了可以透過AAD驗證,我們需要在AAD中加入並賦予我們的程式相關權限。
l   切換到AD管理介面、應用程式
l   新增一個原生應用程式
l   輸入名稱
l   輸入一個合法的URI
l   完成後,切換到應用程式的設定頁面
l   加入應用程式
l   加入Windows Azure Service Management
l   完成後委派權限
l   然後存檔
l   回到畫面上方把用戶端識別碼(Client ID)記錄下來,稍後會用到
l   接著,如果AAD中還沒有使用者,請先創建一個新的使用者。我們要將此使用者加入成為co-admin
l   則切換到管理頁簽確認共同管理員
l   以該使用者登入https://manage.windowsazure.com 確認可以看到服務,並且已經不需更改密碼。
l   切換到Azure AD管理頁簽,並切換到應用程式頁簽
l   按下下方的檢視端點
l   紅框框起來的地方即是此AADTenant ID,請先記起來
l   接著,打開Visual Studio專案,加入Active Directory Authentication Library
l   在專案中加入以下這段程式碼
        protected static string GetAuthorizationHeader()
        {
            AuthenticationResult result = null;
            var context = new AuthenticationContext("https://login.windows.net/<<Tenant ID>>");
            var thread = new Thread(() =>
            {
                result = context.AcquireToken("https://management.core.windows.net/", "<<Client ID>>", new UserCredential("<<User ID>>", "<<Password>>"));
                            });

            thread.SetApartmentState(ApartmentState.STA);
            thread.Name = "AquireTokenThread";
            thread.Start();
            thread.Join();

            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            string token = result.AccessToken;
            return token;
        }
l   呼叫API前,先加入Authentication Header
string token = GetAuthorizationHeader();
var REQUEST_URL = string.Format("https://management.core.windows.net/{0}/services/storageservices", <<SUBSCRIPTION ID>>);
HttpWebRequest request = HttpWebRequest.Create(REQUEST_URL)
request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
request.Method = "GET";
request.Headers.Add("x-ms-version","2015-04-01");
l   呼叫API
using (var resp = request.GetResponse())
            {
                using (var respStream = resp.GetResponseStream())
                {
                    using (var sr = new StreamReader(respStream))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }

參考資料:


2015年7月21日

[Azure]將Azure File Service mount到Linux機器上

Azure File Service透過SMB 2.1協定將Azure Storage以File Share的形式讓用戶端更簡單的存取檔案。在此服務推出之前,如果需要在Azure環境中建置類似Share Storage的機制時,大多必須自行架設file Server;透過Azure File Service,不需另外建立機器也可以提供Share Storage的功能。

Azure File Service目前每一個Share最大為5TB的空間,最大的IOPS為1000。每個File Share最大的Throughput為60MB/s。

Azure File Service目前為預覽服務,如果尚未啟用,需到這裡啟用此預覽功能:http://azure.microsoft.com/en-us/services/preview/

此用功能之後,可以透過Powershell來建立一個新的share,詳細的步驟可以參考這裡的文件:http://blogs.technet.com/b/canitpro/archive/2014/09/23/step-by-step-create-a-file-share-in-azure.aspx

或是,透過https://portal.azure.com的介面建立

image

要注意的是,目前為止,Azure Storage v2尚未支援File Service;因此如果要使用Azure File Service,則從https://manage.windowsazure.com建立傳統儲存體

如果需要在Linux環境中將Azure File Share mount起來,需要注意Linux OS必須支援SMB 2.1協定,在Azure的Gallery中,需要選擇較新的Linux Distribution才能使用;例如Ubuntu 15。

下面會以Ubuntu 15.04為例,說明如何將已經建立的File Share mount到機器中。

  • 首先安裝cifs-utils最新版,這個版本在Ubutu 15.04的Azure Gallery Image中已經安裝。

sudo apt-get install cifs-utils

  • 建立一個directory

sudo mkdir /mnt/share

  • 透過以下的指令mount file share

sud mount.cifs –o vers=2.1,user=<STORAGE ACCOUNT NAME>,password=<STORAGE ACCOUNT KEY> //<FILE SHARE FQDN>/<SHARE NAME> /mnt/share

例如,如果我的Storage account為abcde;Storage Key為12345;File Share為myshare則指另為

sud mount.cifs –o vers=2.1,user=abcde,password=12345 //abcde.file.core.windows.net/myshare /mnt/share

執行完後可以透過df -h確認

image

2015年7月5日

透過ARM Template發布Marketplace Offering

上一篇我們展示了如何透過ARM Template由Azure Gallery所提供的映像建置佈署虛擬機器;我們一樣可以透過同樣的方式來佈署Marketplace中的機器;作法一樣,唯一的不同只有Template File的Schema不同。

以我們的夥伴的Marketplace Offering為例:http://azure.microsoft.com/en-us/marketplace/partners/advantech/susiaccess30-std/

  • 首先透過Azure powershell取得Publisher、Offer與Sku

image

  • 接著,修改我們的Template,主要的改變在virtual machines一段
    • 在virtual Machnes宣告中,加入plan宣告
         1: "plan": {
         2:     "name": "std",
         3:     "product": "susiaccess30",
         4:     "promotionCode": null,
         5:     "publisher": "advantech"
         6: },

    • 其中

      • name為先前powershell取得的sku
      • product為powershell取得的Offer
      • publisher為PublisherName
      • 如果沒有Promotion Code,這邊填上null

  • 完整的Virtual Machin宣告如下


   1: {
   2:     "apiVersion": "2015-05-01-preview",
   3:     "type": "Microsoft.Compute/virtualMachines",
   4:     "name": "susivm",
   5:     "location": "[resourceGroup().location]",
   6:     "dependsOn": [
   7:         "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
   8:         "[concat('Microsoft.Network/networkInterfaces/', 'nicJumpBox')]"
   9:     ],
  10:     "plan": {
  11:         "name": "std",
  12:         "product": "susiaccess30",
  13:         "promotionCode": null,
  14:         "publisher": "advantech"
  15:     },
  16:     "properties": {
  17:         "hardwareProfile": {
  18:             "vmSize": "[parameters('vmSize')]"
  19:         },
  20:         "osProfile": {
  21:             "computername": "susiaccess",
  22:             "adminUsername": "[parameters('adminUsername')]",
  23:             "adminPassword": "[parameters('adminPassword')]"
  24:         },
  25:         "storageProfile": {
  26:             "imageReference": {
  27:                 "publisher": "advantech",
  28:                 "offer": "susiaccess30",
  29:                 "sku": "std",
  30:                 "version": "latest"
  31:             },
  32:             "osDisk": {
  33:                 /*"operatingSystemType": "Windows",*/
  34:                 "name": "susiaccess30-osdisk",
  35:                 "vhd": {
  36:                     "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/vhds/','osdisk-vm-test',  '.vhd')]"
  37:                 },
  38:                 "caching": "ReadWrite",
  39:                 "createOption": "FromImage"
  40:                 /*,"sourceImage": null*/
  41:             }
  42:         },
  43:         "networkProfile": {
  44:             "networkInterfaces": [
  45:                 {
  46:                     "properties": {
  47:                         "primary": false
  48:                     },
  49:                     "id": "[resourceId('Microsoft.Network/networkInterfaces','nicJumpBox')]"
  50:                 }
  51:             ]
  52:         }
  53:     }
  54: }

Blog Archive

About Me