本文件已封存並已停止維護。

作法:使用 ACS 管理服務設定信賴憑證者應用程式

發佈時間: 2011年4月

更新日期: 2015年6月

適用於: Azure

  • Microsoft Azure Active Directory 存取控制服務 (也稱為「存取控制服務」或 ACS)

您可以使用 ACS 管理入口網站來設定 ACS 信賴憑證者應用程式 (如需詳細資訊,請參閱信賴憑證者應用程式),或使用 ACS 管理服務來設定。若您要建立自訂的使用者介面以管理 ACS,或針對多用戶的「軟體即服務」(Software as a Service,SaaS) 解決方案自動化新用戶的報到機制時,使用 ACS 管理服務將可提高效益。

Important重要事項
在執行下列步驟之前,請確定您的系統符合 ACS 必要條件中摘要說明的所有 .NET 架構與平台需求。

若要使用 ACS 管理服務設定信賴憑證者應用程式,請完成下列步驟:

您可以使用 ACS 管理入口網站來收集所需的設定資訊。如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站

  1. 啟動 ACS 管理入口網站。如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站

  2. 取得 ACS 管理服務帳戶的值。您可以使用預設的ManagementClient 帳戶。若要檢視此值,請在 ACS 管理入口網站中的頁面左側,於樹狀目錄中按一下 [管理] 區段下方的 [管理服務]。

  3. 取得 ACS 管理服務帳戶密碼的值。若要檢視此值,請執行下列動作:

    1. 在 ACS 管理入口網站中的頁面左側,於樹狀目錄中按一下 [管理] 區段下方的 [管理服務]。

    2. 在 [管理服務] 頁面上,按一下 [管理服務帳戶] 下方的 ManagementClient

    3. 在 [編輯管理服務帳戶] 頁面的 [認證] 下方,按一下 [密碼]。

    4. 在 [編輯管理認證] 頁面上,複製 [密碼] 欄位中的值。

  4. 取得 Azure 命名空間的名稱。您可以從 Azure 入口網站或從 ACS 管理入口網站的 URL 中取得此值。例如,在 http://contoso.accesscontrol.windows.net 中,命名空間名稱為 contoso。

  5. 取得 ACS 主機名稱。此值通常為accesscontrol.windows.net 。

在此步驟中,您會建立可執行程式碼以新增 ACS 規則群組與規則的範例主控台應用程式。

  1. 開啟 Visual Studio 2012,然後在 Windows 安裝的範本下建立新的主控台應用程式專案。

  2. 將下列程式碼新增至 Program 類別中,然後將 serviceIdentityPasswordForManagement、serviceNamespace 與 acsHostName 等變數指派給您在前一個步驟中收集到的適當設定資訊。

    public const string serviceIdentityUsernameForManagement = "ManagementClient";
    public const string serviceIdentityPasswordForManagement = "My Password/Key for ManagementClient";
    public const string serviceNamespace = "MyNameSpaceNoDots";
    public const string acsHostName = "accesscontrol.windows.net";
    public const string acsManagementServicesRelativeUrl = "v2/mgmt/service/";
    static string cachedSwtToken;
    
    

在此步驟中,您會識別必要的相依性,並將其新增至服務與組件。

  1. 以滑鼠右鍵按一下 [參考],再按一下 [新增參考],然後新增參考至 System.Web.Extensions。

    note附註
    您可能必須在 [方案總管] 中以滑鼠右鍵按一下您的範例主控台應用程式名稱,選取 [內容],然後將範例應用程式的目標架構從 [.NET Framework 4 用戶端設定檔] (在您建立新的主控台應用程式時依預設指派的) 變更為 [.NET Framework 4]。

  2. 以滑鼠右鍵按一下 [服務參考],按一下 [新增服務參考],然後將服務參考新增至管理服務。管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:

    https://您的命名空間.accesscontrol.windows.net/v2/mgmt/service

  3. 新增下列宣告,其中 MyConsoleApplication 是您主控台應用程式的名稱:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates; 
    using MyConsoleApplication.MyServiceReference;
                  
    

在此步驟中,您會實作管理服務用戶端。

  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 方法及其協助程式方法新增至 Program 類別。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;
    
            }
    
    
    

在此步驟中,您會建立一個範例信賴憑證者應用程式,而該應用程式使用 SAML 2.0 權杖格式 (預設選項)、沒有權杖加密原則 (預設選項)、與 Windows Live ID (Microsoft 帳戶) 身分識別提供者相關聯 (預設選項)、具有 600 秒的權杖存留期 (預設選項),而且具有信賴憑證者應用程式的自訂 X.509 權杖簽署憑證或存取控制命名空間的權杖簽署憑證。

  1. 將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. 將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的信賴憑證者應用程式 (您可以將其命名為 “MyRelyingPartyApplication”,如下列程式碼所示),並儲存變更:

    note附註
    使用您的 X.509 憑證的有效完整路徑,取代以下程式碼中的 "Full path to your .PFX file"。例如,若名為 ACS2ClientCertificate.cer 的憑證儲存在 C:\ 之下,則正確的值為 "C:\ ACS2ClientCertificate.cer"。

    使用您的 X.509 憑證的正確密碼,取代以下程式碼中的 “MyCertificatePassword”。

    
                //Create Relying Party Application
    
                RelyingParty relyingParty = new RelyingParty()
                {
                    Name = "MyRelyingPartyApplication",
                    AsymmetricTokenEncryptionRequired = false,
                    TokenType = "SAML_2_0",
                    TokenLifetime = 3600
                };
    
                svc.AddToRelyingParties(relyingParty);
    
    
                //Create the Realm Address
    
                RelyingPartyAddress realmAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Realm",
                    EndpointType = "Realm"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress);
    
                //Create the Return URL Address
    
                RelyingPartyAddress replyAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Reply",
                    EndpointType = "Reply"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress);
    
              // Create a Rule Group for This Relying Party Application
    
                RuleGroup rg = new RuleGroup();
                rg.Name = "SampleRuleGroup For " + relyingParty.Name;
                svc.AddToRuleGroups(rg);
    
                // Assign This New Rule Group to Your New Relying Party Application
    
                RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup();
    
                svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup);
                svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
                svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
    
    
                //Save Your New Relying Party Application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

  1. 將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。

    ManagementService svc = CreateManagementServiceClient();
    
    
  2. 將下列程式碼新增至 Program 類別,以建立協助程式功能 ReadBytesFromPfxFile 來讀取 X.509 憑證中的位元組:

    //Helper Function to Read Bytes from Your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
    
                return signingCertificate;
            }
    
    
  3. 將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的信賴憑證者應用程式 (您可以將其命名為 “MyRelyingPartyApplication”,如下列程式碼所示),並儲存變更:

    note附註
    使用您的 X.509 憑證的有效完整路徑,取代以下程式碼中的 "Full path to your .PFX file"。例如,若名為 ACS2ClientCertificate.cer 的憑證儲存在 C:\ 之下,則正確的值為 "C:\ ACS2ClientCertificate.cer"。

    使用您的 X.509 憑證的正確密碼,取代以下程式碼中的 “MyCertificatePassword”。

    
                //Create Relying Party Application
    
                RelyingParty relyingParty = new RelyingParty()
                {
                    Name = "MyRelyingPartyApplication",
                    AsymmetricTokenEncryptionRequired = false,
                    TokenType = "SAML_2_0",
                    TokenLifetime = 3600
                };
    
                svc.AddToRelyingParties(relyingParty);
    
    
                //Create the Realm Address
    
                RelyingPartyAddress realmAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Realm",
                    EndpointType = "Realm"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress);
    
                //Create the Return URL Address
    
                RelyingPartyAddress replyAddress = new RelyingPartyAddress()
                {
                    Address = "http://TestRelyingParty.com/Reply",
                    EndpointType = "Reply"
                };
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress);
    
                //Create a Signing Certificate
    
                X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", "MyCertificatePassword");
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
    
                string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
    
                byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime(),
                    Type = "X509Certificate",
                    Usage = "Signing",
                    IsPrimary = true,
                    Value = signingCertificate,
                    Password = Encoding.UTF8.GetBytes("MyCertificatePassword")
                };
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
              // Create a Rule Group for This Relying Party Application
    
                RuleGroup rg = new RuleGroup();
                rg.Name = "SampleRuleGroup For " + relyingParty.Name;
                svc.AddToRuleGroups(rg);
    
                // Assign This New Rule Group to Your New Relying Party Application
    
                RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup();
    
                svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup);
                svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
                svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup);
    
    
                //Save Your New Relying Party Application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    
    

另請參閱

概念

ACS 的作法

顯示: