如何:使用 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 签名证书字符串。

若要查找管理服务标识用户名和密码,请使用以下过程。

  1. 转到Microsoft Azure管理门户 (https://manage.WindowsAzure.com) 登录,然后单击“Active Directory”。 (故障排除提示:“Active Directory”项缺失或不可用) 若要管理访问控制命名空间,请选择命名空间,然后单击“管理”。 (或者,单击“访问控制命名空间”,选择命名空间,然后单击“管理”。)

  2. 单击“管理服务”,然后选择一个管理服务,如 ManagementClient

  3. “名称”字段的值是管理服务标识用户名

  4. “凭据”部分,单击“密码”。 “密码”字段中的值是 Management Service identity password

收集所需信息后,请按照以下步骤创建一个示例控制台应用程序,该应用程序将执行代码以添加为标识提供者:

  1. "开始"菜单 Visual Studio并创建新的控制台应用程序项目。

  2. 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 – 添加对所需服务和程序集的引用

此步骤将确定所需的依赖项并将其添加到服务和程序集中。

将所需的依赖项添加到服务和程序集中

  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;
    

步骤 3 - 实现管理服务代理

此步骤将创建一个封装了管理服务代理实现的方法。

实现管理服务代理

  1. 将以下方法添加到 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;
            }
    
  2. 实现 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 添加为标识提供程序

  1. 初始化管理服务代理。

    ManagementService svc = CreateManagementServiceClient();
    
  2. 将标识提供程序添加为颁发者。

    Issuer issuer = new Issuer
           {
           Name = identityProviderName
    };
           svc.AddToIssuers(issuer);
           svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. 创建标识提供程序。

    IdentityProvider identityProvider = new IdentityProvider()
    {
        DisplayName = identityProviderName,
        Description = identityProviderName,
        WebSSOProtocolType = "WsFederation",
        IssuerId = issuer.Id
    };
           svc.AddObject("IdentityProviders", identityProvider);
    
  4. 基于前面获取的证书创建标识提供程序签名密钥。

    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);
    
  5. 更新标识提供程序登录地址。

    IdentityProviderAddress realm = new IdentityProviderAddress()
    {
        Address = "http://SampleIdentityProvider.com/sign-in/",
        EndpointType = "SignIn",
        IdentityProvider = identityProvider,
    };
    svc.AddRelatedObject(identityProvider, "IdentityProviderAddresses", realm);
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  6. 将该标识提供程序设为可供管理服务以外的信赖方使用。

    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 - 测试你的工作

测试你的工作

  1. “访问控制服务”页上,单击“信任关系”部分中的“规则组”链接。

  2. 单击任一可用规则。

  3. “编辑规则组”页上,单击“添加规则”链接。

  4. “添加声明规则”页上,从“声明颁发者”部分的下拉列表中选择新添加的标识提供程序。

  5. 将其他字段保留为默认值。

  6. 单击“ 保存”。

你刚刚为该标识提供程序创建了传递规则。