如何:使用 ACS 管理服务配置 OpenID 标识提供者

更新时间:2015 年 6 月 19 日

适用于:Azure

应用于

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

  • OpenID 2.0

总结

本主题概述添加支持 OpenID 协议的标识提供程序所需的基本步骤。 可以使用管理服务将 OpenID 标识提供者添加到 ACS。 无法使用 ACS 管理门户添加 OpenID 标识提供者。 本主题引用 OpenID 2.0 规范,因为这是 ACS 支持的规范版本。

目录

  • 目标

  • 概述

  • 步骤摘要

  • 步骤 1 - 收集配置信息

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

  • 步骤 3 - 实现管理服务客户端

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

目标

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

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

概述

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

步骤摘要

  • 步骤 1 - 收集配置信息

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

  • 步骤 3 - 实现管理服务客户端

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

步骤 1 - 收集配置信息

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

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

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

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

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

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

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

  • 服务的命名空间

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

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

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

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

        static string serviceIdentityUsernameForManagement = "ManagementClient";
        static string serviceIdentityPasswordForManagement = "...update to your password...";

        static string serviceNamespace = "...update to your namespace...";
        static string acsHostName = "accesscontrol.windows.net";
        static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";

        static string identityProviderName = "My Open ID Identity Provider";

        static string cachedSwtToken;

步骤 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 - 添加标识提供程序

此步骤使用前面创建的管理服务客户端添加 OpenID 标识提供程序。

添加 OpenID 标识提供程序

  1. Main 方法内部,初始化管理服务客户端。

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

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

                var openId = new IdentityProvider
                {
                    DisplayName = identityProviderName,
                    Description = identityProviderName,
                    WebSSOProtocolType = "OpenId",
                    IssuerId = issuer.Id
                };
    
                svc.AddObject("IdentityProviders", openId);
    
  4. 更新标识提供程序登录地址。 在本练习中,你将使用 www.myopenid.com 作为登录地址。 其他 OpenID 标识提供程序包括 Google 和 Yahoo!,它们有自己的登录地址。 https://www.google.com/accounts/o8/ud它们分别是和https://open.login.yahooapis.com/openid/op/auth

                var openIdAddress = new IdentityProviderAddress
                {
                    Address = "https://www.myopenid.com/server",
                    EndpointType = "SignIn"
                };
    
                svc.AddRelatedObject(openId, "IdentityProviderAddresses", openIdAddress);
                svc.SaveChanges();
    
  5. 将该标识提供程序设为可供管理服务以外的信赖方使用。

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