如何:使用 ACS 管理服務來設定信賴憑證者應用程式
更新日期:2015 年 6 月 19 日
適用對象:Azure
套用至
- Microsoft Azure Active Directory 存取控制服務 (也稱為「存取控制服務」或 ACS)
概觀
您可以使用 ACS 管理入口網站 (設定 ACS 信賴憑證者應用程式,以取得詳細資訊,請參閱 信賴憑證者應用程式) 或 ACS 管理服務。 如果您要建置自訂使用者介面來管理 ACS,或想要將多租使用者軟體即服務 (SaaS) 解決方案的新租使用者上線自動化,則使用 ACS 管理服務會更有效率。
使用 ACS 管理服務設定信賴憑證者應用程式的步驟
重要
執行下列步驟之前,請確定您的系統符合 ACS 必要條件中摘要的所有 .NET Framework 和平臺需求。
若要使用 ACS 管理服務設定信賴憑證者應用程式,請完成下列步驟:
步驟 1 – 收集 ACS 設定資訊
步驟 2 – 建立範例主控台應用程式
步驟 3 – 新增必要服務與組件的參考
步驟 4 – 實作管理服務用戶端
步驟 5 – 新增信賴憑證者應用程式
步驟 1 – 收集 ACS 設定資訊
您可以使用 ACS 管理入口網站來收集必要的組態資訊。 如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站。
收集 ACS 設定資訊
啟動 ACS 管理入口網站。 如需如何啟動 ACS 管理入口網站的詳細資訊,請參閱 ACS 管理入口網站。
取得 ACS 管理服務帳戶的值。 您可以使用預設的ManagementClient 帳戶。 若要檢視此值,請在 ACS 管理入口網站中,按一下頁面左側樹狀目錄中 [系統管理] 區段下的[管理服務]。
取得 ACS 管理服務帳戶密碼的值。 若要檢視此值,請執行下列動作:
在 ACS 管理入口網站中,按一下頁面左側樹狀目錄中 [系統管理] 區段下的 [管理服務]。
在 [管理服務] 頁面上,按一下 [管理服務帳戶] 下方的 ManagementClient。
在 [編輯管理服務帳戶] 頁面的 [認證] 下方,按一下 [密碼]。
在 [編輯管理認證] 頁面上,複製 [密碼] 欄位中的值。
取得 Azure 命名空間的名稱。 您可以從Azure 入口網站或 ACS 管理入口網站的 URL 取得此值。 例如,在 中 http://contoso.accesscontrol.windows.net ,命名空間名稱為 contoso。
取得 ACS 主機名稱。 此值通常為accesscontrol.windows.net 。
步驟 2 – 建立範例主控台應用程式
在此步驟中,您會建立範例主控台應用程式,以執行程式碼來新增 ACS 規則群組和規則。
建立範例主控台應用程式
開啟 Visual Studio 2012,在已安裝Windows範本下建立新的主控台應用程式專案。
將下列程式碼新增至 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;
步驟 3 – 新增必要服務與組件的參考
在此步驟中,您會識別必要的相依性,並將其新增至服務與組件。
將必要的相依性新增到服務與組件
以滑鼠右鍵按一下 [參考],再按一下 [新增參考],然後新增參考至 System.Web.Extensions。
注意
您可能必須在 [方案總管] 中以滑鼠右鍵按一下您的範例主控台應用程式名稱,選取 [內容],然後將範例應用程式的目標架構從 [.NET Framework 4 用戶端設定檔] (在您建立新的主控台應用程式時依預設指派的) 變更為 [.NET Framework 4]。
以滑鼠右鍵按一下 [服務參考],按一下 [新增服務參考],然後將服務參考新增至管理服務。 管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:
HTTPs:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service
新增下列宣告,其中 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;
步驟 4 – 實作管理服務用戶端
在此步驟中,您會實作管理服務用戶端。
實作管理服務用戶端
將下列方法加入至 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; }
將 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; }
步驟 5 – 新增信賴憑證者應用程式
在此步驟中,您會使用 SAML 2.0 權杖格式建立範例信賴憑證者應用程式 (,) 預設選項) , 沒有權杖加密原則 (預設選項) ,與Windows Live ID (Microsoft 帳戶相關聯的) 識別提供者 (預設選項) 、600 秒的權杖存留期 (預設選項) ,以及信賴憑證者應用程式的自訂 X.509 權杖簽署憑證或 的權杖簽署憑證存取控制命名空間。
若要新增具有存取控制命名空間權杖簽署憑證的信賴憑證者應用程式
將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。
ManagementService svc = CreateManagementServiceClient();
將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的信賴憑證者應用程式 (您可以將其命名為 “MyRelyingPartyApplication”,如下列程式碼所示),並儲存變更:
注意
使用您的 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);
新增具有專用權杖簽署憑證的信賴憑證者應用程式
將下列程式碼新增至 Program 類別中的 Main 方法,以初始化管理服務用戶端。
ManagementService svc = CreateManagementServiceClient();
將下列程式碼新增至 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; }
將下列程式碼新增至 Program 類別中的 Main 方法,以新增您新的信賴憑證者應用程式 (您可以將其命名為 “MyRelyingPartyApplication”,如下列程式碼所示),並儲存變更:
注意
使用您的 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);