Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

いまさら AppFabric ACS を弄ぶ その1

こんばんは、statemachineです。PDC10も終わり新しい目白押しの今日この頃、いかがお過ごしでしょうか。
ボチボチ、AppFabricでも弄んでみようと思いつつ、ServiceBusかACSかどちらから手をつけようかなと思いなやんでいる最中です。もう新しい機能がLabsとかで公開されており、周回遅れは承知の上、基礎から備忘録をかねてレッツトライ。

準備

Windows Azure 開発環境は既に構築済みとして、AppFabricに必要なものは、以下の+α。

現状、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を設定すると。

Issuer

Issuer Name/Issuer Keyを設定します。これは、クライアント側からAppFabricにトークンを要求するときに使う。

Rule

Ruleは、クレームを記述するのかな。以下の場合は、mode=adminというクレームを発行すると(思う)

ここまで設定して、Cloud上に保存します。

クライアント

まず、クライアントは、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が返却されるところまでできたわけです。このトークンをサービスに提示して承認するところは、次回。