方法: ACS 管理サービスを使用して OpenID ID プロバイダーを構成する
更新日: 2015 年 6 月 19 日
適用先:Azure
適用対象
Microsoft® Azure™ Access Control Service (ACS)
OpenID 2.0
まとめ
このトピックでは、OpenID プロトコルをサポートする ID プロバイダーを追加するために必要な基本手順の概要を示します。 OpenID ID プロバイダーは、管理サービスを使用して ACS に追加できます。 ACS 管理ポータルを使用して OpenID ID プロバイダーを追加することはできません。 このトピックでは、OPENID 2.0 仕様を参照します。これは ACS がサポートする仕様バージョンであるためです。
内容
目標
概要
手順の要約
手順 1 – 構成情報を収集する
手順 2 – 必要なサービスとアセンブリへの参照を追加する
手順 3 - 管理サービス クライアントを実装する
手順 4 – ID プロバイダーを追加する
目標
必要な前提条件と構成情報を特定します。
OpenID ID プロバイダーを追加するために必要な手順を一覧表示する。
概要
管理サービスは、ACS の主要なコンポーネントの 1 つである Web サービスです。 管理サービスは、管理ポータル ユーザー インターフェイスを介して使用できる機能を公開します。 管理ポータルで実行できる操作は管理サービスを使用して実行することもできます。 OpenID ID プロバイダー ACS を追加すると、インターネット スケールの ID 管理メカニズムの開発と維持を節約できます。 OpenID ID プロバイダーを追加するタスクを実行するには、特定の手順に従うコードを記述します。 このトピックでは、これらの基本手順の概要を示します。
手順の要約
手順 1 – 構成情報を収集する
手順 2 – 必要なサービスとアセンブリへの参照を追加する
手順 3 - 管理サービス クライアントを実装する
手順 4 – ID プロバイダーを追加する
手順 1 – 構成情報を収集する
この手順では、必要な構成情報を特定して収集する方法を示します。 次の情報を収集する必要があります。
管理サービス ID ユーザー名 — ManagementClient。
管理サービス ID パスワード — 管理サービスのサービス ID パスワードを取得するには:
アクセス制御サービスの管理ポータルにログオンします。
[管理] セクションで、[管理サービス] リンクをクリックします。
[管理サービス] ページで、[ManagementClient] リンク (ManagementClient はサービスの実際のユーザー名です) をクリックします。
[資格情報] セクションで、[対称キー] または [パスワード] リンクをクリックします。 どちらも値は同じです。 これはパスワードです。
サービスの名前空間
ACS ホスト名 — 通常は accesscontrol.windows.net です。
必要な情報を収集したら、以下の手順に従って、OpenID ID プロバイダーを追加するためのコードを実行するサンプルのコンソール アプリケーションを作成します。
Visual Studio® 2010 を開き、新しいコンソール アプリケーション プロジェクトを作成します。
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 – 必要なサービスとアセンブリへの参照を追加する
この手順では、サービスとアセンブリに必要な依存関係を特定し、追加します。
サービスとアセンブリに必要な依存関係を追加するには
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 メソッドとそのヘルパー メソッドを実装します。 これにより、SWT OAuth トークンが HTTP 要求の承認ヘッダーに追加されます。
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 – ID プロバイダーを追加する
この手順では、前に作成した管理サービス クライアントを使用して、OpenID ID プロバイダーを追加します。
OpenID ID プロバイダーを追加するには
Main メソッド内の管理サービス クライアントを初期化します。
ManagementService svc = CreateManagementServiceClient();
ID プロバイダーを発行者として追加します。
Issuer issuer = new Issuer { Name = identityProviderName }; svc.AddToIssuers(issuer); svc.SaveChanges(SaveChangesOptions.Batch);
ID プロバイダーを作成します。
var openId = new IdentityProvider { DisplayName = identityProviderName, Description = identityProviderName, WebSSOProtocolType = "OpenId", IssuerId = issuer.Id }; svc.AddObject("IdentityProviders", openId);
ID プロバイダーのサインイン アドレスを更新します。 この演習では、サインイン アドレスとして www.myopenid.com を使用します。 他の OpenID ID プロバイダーには 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();
管理サービスを除く証明書利用者が ID プロバイダーが使用できるようにします。
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);