如何:使用 ACS 管理服务将 Facebook 配置为 Internet 标识提供者

更新时间:2015 年 6 月 19 日

适用于:Azure

应用于

  • Microsoft® Azure™ 访问控制服务 (ACS)

  • Facebook

总结

本主题概述将 Facebook 添加为标识提供程序所需的基本步骤。 可以使用管理门户将 Facebook 添加为 ACS 的标识提供者,也可以使用 ACS 管理服务将其自动化。 例如,使用管理服务非常有用,例如,在构建用于管理 ACS 的自定义用户界面时,或者在自动为多租户软件即服务载入新租户时, (SaaS) 解决方案。

目录

  • 目标

  • 概述

  • 步骤摘要

  • 步骤 1 - 收集配置信息

  • 步骤 2 – 添加对所需服务和程序集的引用

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

  • 步骤 4 - 添加标识提供程序

  • 步骤 5 - 测试你的工作

目标

  • 确定所需先决条件和配置信息。

  • 列出将 Facebook 添加为标识提供程序所需的步骤。

  • 测试配置是否成功。

概述

管理服务是一种 Web 服务,它是 ACS 的关键组件之一。 管理服务公开通过管理门户用户界面提供的功能。 任何可以在管理门户中完成的操作也可以使用管理服务完成。 将 Facebook 作为标识提供者添加到 ACS 后,可以节省对 Internet 规模标识管理机制的开发和维护。 若要完成将 Facebook 配置为标识提供程序的任务,需要编写执行特定步骤的代码。 本主题概述了这些基本步骤。

步骤摘要

  • 步骤 1 - 收集配置信息

  • 步骤 2 – 添加对所需服务和程序集的引用

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

  • 步骤 4 - 添加标识提供程序

  • 步骤 5 - 测试你的工作

步骤 1 - 收集配置信息

本步骤确定并说明了如何收集所需的配置信息。 你需要收集以下信息:

  • 管理服务标识用户名 - ManagementClient

  • 管理服务标识密码 - 若要获取管理服务的服务标识密码,请执行以下操作:

    1. 登录到访问控制服务管理门户。

    2. “管理”部分中,单击“管理服务”链接。

    3. “管理服务”页上,单击“ManagementClient”链接(ManagementClient 是该服务的实际用户名)。

    4. “凭据”部分中,单击“对称密钥”“密码”链接。 每个字段中的值是相同的。 这是密码。

  • 服务的命名空间

  • ACS 主机名 - 通常 accesscontrol.windows.net。

  • Facebook 应用程序 ID 和应用程序机密 - 按照操作说明操作 :将 Facebook 配置为标识提供者

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

  1. 打开 Visual Studio® 2010 并创建一个新的控制台应用程序项目。

  2. Program 类中,使用类似于以下内容的代码为模块作用域变量分配先前收集的信息。

static string serviceIdentityUsernameForManagement = "ManagementClient";
static string serviceIdentityPasswordForManagement = "My Password for my ManagementClient";

static string serviceNamespace = "MyNameSpaceNoDots";
static string acsHostName = "accesscontrol.windows.net";
static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";


static string cachedSwtToken;
static string identityProviderName = "Facebook";

static string facebookAppId = "Your Facebook AppID";
static string facebookAppSecret = "Your Facebook Secret";

步骤 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;
    using System.Globalization;
    using System.Runtime.Serialization.Json;
    using ConsoleApplication1.ServiceReference1;
    

请注意,如果你在创建控制台应用程序或添加对管理服务的引用时更改了默认值,则最后一个声明(即 ConsoleApplication1.ServiceReference1)可能会有所不同。

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

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

实现管理服务代理

  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 方法及其帮助程序方法。 它将 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, "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;
    
            }
    
    

步骤 4 - 添加标识提供程序

此步骤使用前面创建的管理服务代理将 Facebook 添加为标识提供程序。

将 Facebook 添加为标识提供程序

  1. Main 方法中初始化管理服务代理。

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

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

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

    var facebookKeys = new[]
        {
            new IdentityProviderKey
                {
                    IdentityProvider = facebook,
                    StartDate = DateTime.UtcNow,
                    EndDate = DateTime.UtcNow.AddYears(1),
                    Type = "ApplicationKey",
                    Usage = "ApplicationId",
                    Value = Encoding.UTF8.GetBytes(facebookAppId)
                },
            new IdentityProviderKey
                {
                    IdentityProvider = facebook,
                    StartDate = DateTime.UtcNow,
                    EndDate = DateTime.UtcNow.AddYears(1),
                    Type = "ApplicationKey",
                    Usage = "ApplicationSecret",
                    Value = Encoding.UTF8.GetBytes(facebookAppSecret)
                }
        };
    
    foreach (var key in facebookKeys)
    {
        svc.AddRelatedObject(facebook, "IdentityProviderKeys", key);
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  5. 将该标识提供程序设为可供管理服务以外的信赖方使用。

    foreach (RelyingParty rp in svc.RelyingParties)
    {
        // skip the built-in management RP. 
        if (rp.Name != "AccessControlManagement")
        {
            svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
            {
                IdentityProviderId = facebook.Id,
                RelyingPartyId = rp.Id
            });
        }
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    

步骤 5 - 测试你的工作

测试你的工作

  1. 登录到访问控制服务管理门户。

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

  3. 单击任一可用规则。

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

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

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

  7. 单击“ 保存”。

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