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();
                    }
                }
            }

參考資料:


沒有留言:

Blog Archive

About Me