共用方式為


如何:使用 ACS 管理服務來設定 OpenID 識別提供者

更新日期:2015 年 6 月 19 日

適用對象:Azure

套用至

  • Microsoft® Azure™ 存取控制服務 (ACS)

  • OpenID 2.0

總結

這個主題說明新增支援 OpenID 通訊協定的身分識別提供者所需要的基本步驟。 OpenID 識別提供者可以使用管理服務新增至 ACS。 無法使用 ACS 管理入口網站來新增 OpenID 識別提供者。 在本主題中,我們會參考 OpenID 2.0 規格,因為這是 ACS 支援的規格版本。

目錄

  • 目標

  • 概觀

  • 步驟摘要

  • 步驟 1 – 收集設定資訊

  • 步驟 2 – 新增必要服務和元件的參考

  • 步驟 3 – 實作管理服務用戶端

  • 步驟 4 – 新增身分識別提供者

目標

  • 識別必要的先決條件與設定資訊。

  • 列出新增 OpenID 身分識別提供者的必要步驟。

概觀

管理服務是一種 Web 服務,這是 ACS 的主要元件之一。 管理服務會顯示可透過「管理入口網站」使用者介面使用的功能。 任何可以在管理入口網站中完成的動作,也可以使用管理服務完成。 新增 OpenID 識別提供者 ACS 可讓您節省開發和維護網際網路規模的身分識別管理機制。 若要完成新增 OpenID 身分識別提供者的工作,請撰寫依循特定步驟的程式碼。 本主題概述這些基本步驟。

步驟摘要

  • 步驟 1 – 收集設定資訊

  • 步驟 2 – 新增必要服務和元件的參考

  • 步驟 3 – 實作管理服務用戶端

  • 步驟 4 – 新增身分識別提供者

步驟 1 – 收集設定資訊

此步驟識別並顯示如何收集必要的設定資訊。 您需要收集下列資訊:

  • 管理服務身分識別使用者名稱 - ManagementClient

  • 管理服務身分識別密碼 - 若要取得該項管理服務的服務身分識別密碼:

    1. 登入「存取控制服務管理入口網站」。

    2. 在 [系統管理] 區段中,按一下 [管理服務] 連結。

    3. 在 [管理服務] 頁面上,按一下 [ManagementClient] 連結 (ManagementClient 是服務的實際使用者名稱)。

    4. 在 [認證] 區段中,按一下 [對稱金鑰] 或 [密碼] 連結。 這兩處內的值相同。 這是密碼。

  • 您的服務命名空間

  • ACS 主機名稱 - 通常是 accesscontrol.windows.net

收集必要的資訊後,請執行下列步驟建立主控台應用程式範例,該應用程式將執行程式碼來新增 OpenID 身分識別提供者。

  1. 開啟 Visual Studio® 2010 並建立新的主控台應用程式專案。

  2. Program 類別中,使用類似下列內容的程式碼,將稍早收集到的資訊指派給模組範圍變數。

        static string serviceIdentityUsernameForManagement = "ManagementClient";
        static string serviceIdentityPasswordForManagement = "...update to your password...";

        static string serviceNamespace = "...update to your namespace...";
        static string acsHostName = "accesscontrol.windows.net";
        static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";

        static string identityProviderName = "My Open ID Identity Provider";

        static string cachedSwtToken;

步驟 2 – 新增必要服務和元件的參考

此步驟識別並將必要的相依性新增到服務與組件。

將必要的相依性新增到服務與組件

  1. 新增 System.Web.Extensions 的參考。

  2. 新增管理服務的服務參考。 管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:

    HTTPs:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service

  3. 新增下列宣告。

    using System.Web; 
    using System.Net; 
    using System.Data.Services.Client; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization;
    using System.Globalization;
    using System.Runtime.Serialization.Json;
    using ConsoleApplication1.ServiceReference1;
    

請注意最後一個宣告 ConsoleApplication1.ServiceReference1。 若您在建立主控台應用程式或將參考新增至管理服務時變更了預設值,該宣告可能會有所不同。

步驟 3 – 實作管理服務用戶端

此步驟會建立一個方法來封裝管理服務用戶端的實作。

實作管理服務用戶端

  1. 將下列方法新增至 Program 類別。

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. 實作 GetTokenWithWritePermission 方法及其協助程式方法。 它會將 SWT OAuth 權杖新增到 HTTP 要求的授權標頭。

    public static void GetTokenWithWritePermission(object sender, SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "POST", values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

步驟 4 – 新增身分識別提供者

此步驟會使用您稍早建立的管理服務用戶端來新增 OpenID 身分識別提供者。

新增 OpenID 身分識別提供者

  1. Main 方法內,初始化管理服務用戶端。

    ManagementService svc = CreateManagementServiceClient();
    
  2. 將身分識別提供者新增為簽發者。

                Issuer issuer = new Issuer
                {
                    Name = identityProviderName
                };
                svc.AddToIssuers(issuer);
                svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. 建立身分識別提供者。

                var openId = new IdentityProvider
                {
                    DisplayName = identityProviderName,
                    Description = identityProviderName,
                    WebSSOProtocolType = "OpenId",
                    IssuerId = issuer.Id
                };
    
                svc.AddObject("IdentityProviders", openId);
    
  4. 更新身分識別提供者登入位址。 在此練習中,您將使用 www.myopenid.com 作為登入位址。 其他 OpenID 身分識別提供者包含 Google 和 Yahoo!,他們有自己的登入位址。 https://www.google.com/accounts/o8/ud分別是 和 https://open.login.yahooapis.com/openid/op/auth

                var openIdAddress = new IdentityProviderAddress
                {
                    Address = "https://www.myopenid.com/server",
                    EndpointType = "SignIn"
                };
    
                svc.AddRelatedObject(openId, "IdentityProviderAddresses", openIdAddress);
                svc.SaveChanges();
    
  5. 將身分識別提供者設為可供信賴憑證者使用,但管理服務除外。

                foreach (RelyingParty rp in svc.RelyingParties)
                {
                    // skip the built-in management RP. 
                    if (rp.Name != "AccessControlManagement")
                    {
                        svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
                        {
                            IdentityProviderId = openId.Id,
                            RelyingPartyId = rp.Id
                        });
                    }
                }
    
                svc.SaveChanges(SaveChangesOptions.Batch);