如何:使用 ACS 管理服务将 AD FS 2.0 配置为Enterprise标识提供者
更新时间:2015 年 6 月 19 日
适用于:Azure
应用于
Microsoft® Azure™ 访问控制服务 (ACS)
Microsoft Active Directory® 联合身份验证服务 (AD FS) 2.0
总结
本主题介绍如何将标识提供者添加到命名空间或信赖方应用程序。 若要执行此任务,可以执行 ACS 管理服务。 当你构建用于管理 ACS 的自定义用户界面时,以及自动添加多租户软件即服务的新租户 (SaaS) 解决方案时,管理服务特别有用。
目录
目标
概述
步骤摘要
步骤 1 - 收集配置信息
步骤 2 – 添加对所需服务和程序集的引用
步骤 3 - 实现管理服务代理
步骤 4 - 添加标识提供程序
步骤 5 - 测试你的工作
目标
确定需求和配置信息。
列出所需的步骤。
验证配置是否成功。
概述
ACS 管理服务是一种 Web 服务,用于向代码公开 ACS 功能。 ACS 管理服务可以访问所有 ACS 功能,包括 ACS 管理门户用户界面中可用的功能子集。
将 Microsoft 作为标识提供者添加到 ACS 后,可以重复使用对基于云的解决方案的企业标识管理所做的投资。 若要配置为标识提供者,需要编写遵循特定步骤的代码。 本主题概述了这些基本步骤。
步骤摘要
步骤 1 - 收集配置信息
步骤 2 – 添加对所需服务和程序集的引用
步骤 3 - 实现管理服务代理
步骤 4 - 添加标识提供程序
步骤 5 - 测试你的工作
步骤 1 - 收集配置信息
本步骤说明如何收集所需的配置信息。 你需要收集以下信息:
管理服务标识用户名。 默认值为 ManagementClient。
管理服务标识密码。
命名空间名称。
ACS 主机名:accesscontrol.windows.net
签名证书字符串:从部署获取 AD FS 签名证书字符串。
若要查找管理服务标识用户名和密码,请使用以下过程。
转到Microsoft Azure管理门户 (https://manage.WindowsAzure.com) 登录,然后单击“Active Directory”。 (故障排除提示:“Active Directory”项缺失或不可用) 若要管理访问控制命名空间,请选择命名空间,然后单击“管理”。 (或者,单击“访问控制命名空间”,选择命名空间,然后单击“管理”。)
单击“管理服务”,然后选择一个管理服务,如 ManagementClient。
“名称”字段的值是管理服务标识用户名。
在“凭据”部分,单击“密码”。 “密码”字段中的值是 Management Service identity password。
收集所需信息后,请按照以下步骤创建一个示例控制台应用程序,该应用程序将执行代码以添加为标识提供者:
"开始"菜单 Visual Studio并创建新的控制台应用程序项目。
在 Program 类中,为具有模块作用域的变量分配配置信息值。 下面的代码示例显示了如何执行此操作。
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 - 实现管理服务代理
此步骤将创建一个封装了管理服务代理实现的方法。
实现管理服务代理
将以下方法添加到 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 请求的 Authorization 标头。
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 - 添加标识提供程序
此步骤使用前面创建的管理服务代理添加为标识提供者。
将 AD FS 2.0 添加为标识提供程序
初始化管理服务代理。
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 - 测试你的工作
测试你的工作
在“访问控制服务”页上,单击“信任关系”部分中的“规则组”链接。
单击任一可用规则。
在“编辑规则组”页上,单击“添加规则”链接。
在“添加声明规则”页上,从“声明颁发者”部分的下拉列表中选择新添加的标识提供程序。
将其他字段保留为默认值。
单击“ 保存”。
你刚刚为该标识提供程序创建了传递规则。