如何:使用管理服务配置 OpenID 标识提供者
发布时间: 2011年4月
更新时间: 2011年5月
应用到: Windows Azure
适用于
-
Microsoft® Windows Azure™ AppFabric Access Control Service (ACS)
-
OpenID 2.0
摘要
本主题概述了添加支持 OpenID 协议的标识提供者所需的基本步骤。可以使用管理服务将 OpenID 标识提供者添加到 ACS,但无法使用 ACS 管理门户添加 OpenID 标识提供者。在本主题中,我们将涉及 OpenID 2.0 规范,因为这是 ACS 支持的规范版本。
内容
-
目标
-
概述
-
步骤摘要
-
步骤 1 – 收集配置信息
-
步骤 2 – 添加对所需服务和程序集的引用
-
步骤 3 – 实现管理服务客户端
-
步骤 4 – 添加标识提供者
目标
-
确定所需的先决条件和配置信息。
-
列出添加 OpenID 标识提供者所需的步骤。
概述
管理服务是一项 Web 服务,它是 ACS 的一个关键组成部分。管理服务通过管理门户用户界面展示了可用的功能。可以在管理门户中完成的所有操作都能使用管理服务完成。添加 OpenID 标识提供者后,ACS 将允许您在开发和维护 Internet 范围的身份管理机制时进行保存。若要完成添加 OpenID 标识提供者的任务,请按照特定步骤编写代码。本主题概述了这些基本步骤。
步骤摘要
-
步骤 1 – 收集配置信息
-
步骤 2 – 添加对所需服务和程序集的引用
-
步骤 3 – 实现管理服务客户端
-
步骤 4 – 添加标识提供者
步骤 1 – 收集配置信息
此步骤确定和显示如何收集所需的配置信息。需要收集以下信息:
-
管理服务标识用户名 — ManagementClient。
-
管理服务标识密码 — 若要获取管理服务的服务标识密码,请执行以下操作:
-
登录到访问控制服务管理门户 (http://go.microsoft.com/fwlink/?LinkID=129428)。
-
在“管理”部分,单击“管理服务”链接。
-
在“管理服务”页上,单击 ManagementClient 链接(ManagementClient 是服务的实际用户名)。
-
在“凭据”部分,单击“对称密钥”或“密码”链接。每个链接中的值相同。这是密码。
-
登录到访问控制服务管理门户 (http://go.microsoft.com/fwlink/?LinkID=129428)。
-
服务的命名空间
-
ACS 主机名 — 通常为 accesscontrol.windows.net。
收集所需的信息后,请执行这些步骤创建一个示例控制台应用程序,以运行用于添加 OpenID 标识提供者的代码:
-
打开 Visual Studio® 2010 并创建新的控制台应用程序项目。
-
在“程序”类中,使用类似以下代码的代码,将以前收集的信息分配到模块范围变量。
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 – 添加对所需服务和程序集的引用
此步骤确定所需的依存关系并将其添加到服务和程序集。
将所需的依存关系添加到服务和程序集
-
添加对 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; using System.Globalization; using System.Runtime.Serialization.Json; using ConsoleApplication1.ServiceReference1;
请注意最后一个声明 ConsoleApplication1.ServiceReference1。如果在创建控制台应用程序或向管理服务添加引用时更改了默认值,则该声明可能会发生变化。
步骤 3 – 实现管理服务客户端
此步骤创建用于封装管理服务客户端实现的方法。
实现管理服务客户端
-
将以下方法添加到 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; } -
实现 GetTokenWithWritePermission 方法及其 helper 方法。它会将 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 标识提供者
-
在 Main 方法中,初始化管理服务客户端。
ManagementService svc = CreateManagementServiceClient();
-
将您的标识提供者添加为颁发者。
Issuer issuer = new Issuer { Name = identityProviderName }; svc.AddToIssuers(issuer); svc.SaveChanges(SaveChangesOptions.Batch); -
创建标识提供者。
var openId = new IdentityProvider { DisplayName = identityProviderName, Description = identityProviderName, WebSSOProtocolType = "OpenId", IssuerId = issuer.Id }; svc.AddObject("IdentityProviders", openId); -
更新标识提供者登录地址。在此练习中,您将使用 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(); -
让标识提供者可用于信赖方(管理服务除外)。
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);