如何:使用 ACS 管理服務將 AD FS 2.0 設定為Enterprise識別提供者
更新日期:2015 年 6 月 19 日
適用對象:Azure
套用至
Microsoft® Azure™ 存取控制服務 (ACS)
Microsoft Active Directory® Federation Services (AD FS) 2.0
總結
本主題說明如何將識別提供者新增至命名空間或信賴憑證者應用程式。 若要執行這項工作,您可以執行 ACS 管理服務。 當您建置自訂使用者介面來管理 ACS,以及將多租使用者軟體即服務新增為服務 (SaaS) 解決方案時,管理服務特別有用。
目錄
目標
概觀
步驟摘要
步驟 1 – 收集設定資訊
步驟 2 – 新增必要服務和元件的參考
步驟 3 – 實作 Management Service Proxy
步驟 4 – 新增身分識別提供者
步驟 5 – 測試您的工作
目標
識別需求和設定資訊。
列出必要步驟。
驗證設定是否成功。
概觀
ACS 管理服務是 Web 服務,會將 ACS 功能公開給程式碼。 ACS 管理服務可以存取所有 ACS 功能,包括 ACS 管理入口網站使用者介面中可用的功能子集。
將 Microsoft 新增為 ACS 的身分識別提供者,可讓您針對雲端式解決方案重複使用對公司身分識別管理所做的投資。 若要設定為識別提供者,您必須撰寫遵循特定步驟的程式碼。 本主題概述這些基本步驟。
步驟摘要
步驟 1 – 收集設定資訊
步驟 2 – 新增必要服務和元件的參考
步驟 3 – 實作 Management Service Proxy
步驟 4 – 新增身分識別提供者
步驟 5 – 測試您的工作
步驟 1 – 收集設定資訊
此步驟說明如何收集必要的設定資訊。 您需要收集下列資訊:
管理服務身分識別使用者名稱。 預設值為 ManagementClient。
管理服務身分識別密碼。
命名空間名稱。
ACS 主機名稱:accesscontrol.windows.net
簽署憑證字串:從部署取得 AD FS 簽署憑證字串。
若要尋找管理服務身分識別使用者名稱和密碼,請使用下列程序。
移至Microsoft Azure管理入口網站 (https://manage.WindowsAzure.com) 登入,然後按一下[Active Directory]。 (疑難排解提示:「Active Directory」專案遺失或無法使用) 若要管理存取控制命名空間,請選取命名空間,然後按一下 [管理]。 (或按一下 [存取控制命名空間]、選取 [命名空間],然後按一下 [管理])。
按一下 [管理服務],然後選取管理服務,例如 ManagementClient。
[ 名稱 ] 欄位的值是 [管理服務識別使用者名稱]。
在 [認證] 區段中,按一下 [密碼]。 密碼欄位中的值為管理服務身分識別密碼。
收集必要資訊之後,請遵循下列步驟來建立範例主控台應用程式,以執行程式碼以新增為識別提供者:
啟動Visual Studio並建立新的主控台應用程式專案。
在 [程式] 類別中,指派設定資訊值給具有模組範圍的變數。 下列程式碼範例顯示可能的作法。
static string serviceIdentityUsernameForManagement = "ManagementClient"; static string serviceIdentityPasswordForManagement = "ManagementClientPasswordValue"; static string serviceNamespace = "MyNameSpaceNoDots"; static string acsHostName = "accesscontrol.windows.net"; static string signingCertificate = "Very long string representing ADFS signing certificate"; static string cachedSwtToken; static string identityProviderName = "My Other ADFS Identity Provider";
步驟 2 – 新增必要服務和元件的參考
此步驟識別並將必要的相依性新增到服務與組件。
將必要的相依性新增到服務與組件
新增 System.Web.Extensions 的參考。
新增管理服務的服務參考。 管理服務的 URL 對您的命名空間而言是唯一的,而且外觀應與下列內容類似:
HTTPs:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service
新增下列宣告。
using System.Web; using System.Net; using System.Data.Services.Client; using System.Collections.Specialized; using System.Web.Script.Serialization;
步驟 3 – 實作 Management Service Proxy
此步驟會建立一個方法來封裝 Management Service Proxy 的實作。
實作 Management Service Proxy
將下列方法新增至 Program 類別。
public static ManagementService CreateManagementServiceClient() { string managementServiceHead = "v2/mgmt/service/"; string managementServiceEndpoint = string.Format("https://{0}.{1}/{2}", serviceNamespace, acsHostName, managementServiceHead); ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint)); managementService.SendingRequest += GetTokenWithWritePermission; return managementService; }
實作 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, string.Format("OAuth {0}", cachedSwtToken)); } private static string GetTokenFromACS() { // request a token from ACS WebClient client = new WebClient(); client.BaseAddress = string.Format("https://{0}.{1}", serviceNamespace, acsHostName); NameValueCollection values = new NameValueCollection(); values.Add("grant_type", "password"); values.Add("client_id", serviceIdentityUsernameForManagement); values.Add("username", serviceIdentityUsernameForManagement); values.Add("client_secret", serviceIdentityPasswordForManagement); values.Add("password", serviceIdentityPasswordForManagement); byte[] responseBytes = client.UploadValues("/v2/OAuth2-13/rp/AccessControlManagement", "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 – 新增身分識別提供者
此步驟會使用您稍早建立的管理服務 Proxy,新增為識別提供者。
新增 AD FS 2.0 作為身分識別提供者
初始化 Management Service Proxy。
ManagementService svc = CreateManagementServiceClient();
將身分識別提供者新增為簽發者。
Issuer issuer = new Issuer { Name = identityProviderName }; svc.AddToIssuers(issuer); svc.SaveChanges(SaveChangesOptions.Batch);
建立身分識別提供者。
IdentityProvider identityProvider = new IdentityProvider() { DisplayName = identityProviderName, Description = identityProviderName, WebSSOProtocolType = "WsFederation", IssuerId = issuer.Id }; svc.AddObject("IdentityProviders", identityProvider);
使用您稍早獲得的憑證當做基礎,建立一個身分識別提供者簽署金鑰。
IdentityProviderKey identityProviderKey = new IdentityProviderKey() { DisplayName = "SampleIdentityProviderKeyDisplayName", Type = "X509Certificate", Usage = "Signing", Value = Convert.FromBase64String(signingCertificate), IdentityProvider = identityProvider, StartDate = startDate, EndDate = endDate, }; svc.AddRelatedObject(identityProvider, "IdentityProviderKeys", identityProviderKey);
更新身分識別提供者登入位址。
IdentityProviderAddress realm = new IdentityProviderAddress() { Address = "http://SampleIdentityProvider.com/sign-in/", EndpointType = "SignIn", IdentityProvider = identityProvider, }; svc.AddRelatedObject(identityProvider, "IdentityProviderAddresses", realm); svc.SaveChanges(SaveChangesOptions.Batch);
將身分識別提供者設為可供信賴憑證者使用,但管理服務除外。
foreach (RelyingParty rp in svc.RelyingParties) { // skip the built-in management RP. if (rp.Name != "AccessControlManagement") { svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider() { IdentityProviderId = identityProvider.Id, RelyingPartyId = rp.Id }); } } svc.SaveChanges(SaveChangesOptions.Batch);
步驟 5 – 測試您的工作
測試您的工作
在 [存取控制服務] 頁面上,按一下 [信任關係] 區段中的 [規則群組] 連結。
按一下任何一個可用的規則。
在 [編輯規則群組] 頁面上,按一下 [新增規則] 連結。
在 [新增宣告規則] 頁面上,從 [宣告簽發者] 區段的下拉式清單中選擇最近新增的身分識別提供者。
其餘請保留預設值。
按一下 [檔案] 。
您剛剛已經建立了身分識別提供者的傳遞規則。