こんばんは、statemachineです。PDC10も終わり新しい目白押しの今日この頃、いかがお過ごしでしょうか。
ボチボチ、AppFabricでも弄んでみようと思いつつ、ServiceBusかACSかどちらから手をつけようかなと思いなやんでいる最中です。もう新しい機能がLabsとかで公開されており、周回遅れは承知の上、基礎から備忘録をかねてレッツトライ。
準備
Windows Azure 開発環境は既に構築済みとして、AppFabricに必要なものは、以下の+α。
- Windows Identify Foundation SDK (WIF SDK)
- Windows Azure AppFabric SDK 1.0
- Windows Azure Training Kit 2010
現状、VisualStudio 2010に対応しているWIFはVer 4.0(英語のみ)らしいです。また、上記、Training Kit を展開すると、Labs\IntroAppFabricAccessControl にACSのサンプルがあり、これらサンプルには、step by step のWordドキュメントと、未完成のプロジェクトからコードを挿入していくサンプルなどがセットになってます。また、完成系のプロジェクトもあるので、そちらを参考にすると手っ取り早いでしょう。
今回は、AppFabric ACS自信をSTSとして利用するサンプルを元に、理解度を深めるために適当に作っていくことにします。
システム的には以下のような構成図。
AppFabric ACSに情報の登録
まずは、AppFabric ACSに各種情報を登録。現状登録には、コマンドライン(Acm.exe)もしくは、AcmBrowserを利用するんですが、Labsで公開されているCTP版は、ポータルで色々できるらしいです。
Token Policy
まずはToken Policy Key を作成。作成したキーは、AppFabricと、サービス側でシェアします。こうすることで、AppFabricが署名したトークンをサービス側で正しいものとしてチェックできると。これが、信頼関係の構築ということなんでしょう。
Scope
Scopeを作ります。ScopeのAppliceToには、サービス側のURIを設定すると。
クライアント
まず、クライアントは、AppFabric ACSに対して認証を依頼しなければならない。以下がそのコード以下。
認証には、予め登録しておいた、IssuerNameとIssuerKey を利用し、受け取ったセキュリティトークンをサービス側に提示しサービスの承認を受ける流れとなります。
void Main() { string IssuerName = "statemachine"; string IssuerKey = "Issuerキーを入れてね"; // Issuer で生成したキーを入れる var client = new System.Net.WebClient(); client.BaseAddress = "https://xxxxx.accesscontrol.windows.net"; // <- Appfabric のURL // username/password 提供を受けるサービスのURIを設定 var values = new System.Collections.Specialized.NameValueCollection(); values.Add("wrap_name", IssuerName); values.Add("wrap_password", IssuerKey); values.Add("wrap_scope", "http://localhost/appfabric"); // <- サービス提供側のURL // xxxxx.accesscontrol.windows.net/WRAPv0.9 <- がリクエストするエンドポイントとなる。 byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values); // レスポンスの取得 string response = Encoding.UTF8.GetString(responseBytes); Console.WriteLine ("-- response --"); Console.WriteLine (response); // レスポンスを加工 var token = response .Split('&') .Single(value => value.StartsWith("wrap_access_token=", StringComparison.OrdinalIgnoreCase)) .Split('=')[1]; Console.WriteLine ("-- token --"); Console.WriteLine (token); // サービス側に提示する .... .... }
以下のようなセキュリティートークンが入手できます。IssuerNameやKey、URIなどが異なると、400エラーが返却されます。
末尾に付加されているExpiresOnがトークンの有効期限で、HMACSHA256がこのトークンの署名。
レスポンスそのもの。
wrap_access_token=mode%3dadmin%26Issuer%3dhttps%253a%252f%252fcrossbar.accesscontrol.windows.net%252f%26Audience%3dhttp%253a%252f%2
52flocalhost%252fappfabric%26ExpiresOn%3d1288997888%26HMACSHA256%3dG9V692CdjfKfKYaWR4U83OPp71WlQyhC%252bAbxPBIRDJk%253d&wrap_access_token_expires_in=28800
加工して、トークンとして取り出したもの。
mode%3dadmin%26Issuer%3dhttps%253a%252f%252fcrossbar.accesscontrol.windows.net%252f%26Audience%3dhttp%253a%252f%252flocalhost%252fappfabric%26ExpiresOn%3d1288997888%26HMACSHA256%3dG9V692CdjfKfKYaWR4U83OPp71WlQyhC
ここまでで、構成図の1.Token Requestと、2.Tokenが返却されるところまでできたわけです。このトークンをサービスに提示して承認するところは、次回。