無聊を託つさんへ

お手紙ありがとうございます。

すっかり春の陽気で過ごしやすくなりましたね。まだまだ朝晩は冷え込みますのでお体にはお気を付けください。あ、MVPおめでとうございます。
おいらといいますと、おかげさまで元気に忙しく過ごさせて頂いています。

さて例のWCF Data ServicesをFormsAuthenticationでアレコレしてゴニョゴニョする件ですが、ASP.NET MVCのアクションメソッドでこうするとできるんだ~!という新しい知見が開けて大変興味深かったです。

ASP.NET MVCのアクションでやる場合、楽ちん・便利という視点ではなく、アプリケーション全体として見てどうなのかな?と単純に思いました。

WCF Data Servicesのみで完結させた場合は以下のような特徴が考えられます。

  • サーバーサイド(WCF Data Services側)でログオン処理を記述する必要が無い(Web.configに追記でOK)
  • ASP.NETなWebアプリケーションと分けることが出来る(代わりに仮想アプリや仮想サイトが分かれたりしますが)
    つまりMembershipプロバイダを分けることも同じものを使うこともできる

ではASP.NET MVCのアクションの場合はというと。

  • アクションを実装する必要があるが認証の方式を変えたり、ID/Password以外の要素でも評価できる(Authentication_JSON_AppService.axdの仕様に左右されない)
  • 仮想サイト(仮想アプリケーション)が1つで済む
  • Membershipプロバイダを使う必要が無い(もちろん使ってもよい)
  • きめ細かく動作を制御できる

などがありそうです。まぁどちらもにわかな人が考えた内容なので間違ってるかもしれませんが。。

個人的に思うのはやっぱりアプリケーションの構成をどうするか、認証方式をどうするか/したいか、が一番大きなポイントでしょうか。

もともとはおいらが求めた要件にマッチするのがWCF Data Servicesで完結させる方法だった、というのとWebアプリ/データアクセス/認証をできるだけ分離しておきたかったというのが大きなポイントで以前の投稿のような形式になった背景がありますので、単純な比較は難しいですね。(Federation認証等ともからんじゃったり色々…)

ということでケースバイケースという魔法のことばでぽぽぽーん集約してしまいますが、ボツネタにならず公開して頂いてよかった!と思いますです。

あぁ、この内容こそ没ネタにすべきだったかなw

あと関係ないですがTHE CODE PROJECTはいろいろ勉強になりますね。

ではでは。

WCF Data Services で HTTPレスポンスヘッダにアクセスしたい

だいぶ前にWCF Data ServicesでForm認証をやりましたが、Cookieで認証してるんだからいずれCookieの期限が切れるわけです。

で、ASP.NETではCookieの自動更新を有効にするためのフラグ(slidingExpiration)があり、このフラグをtrueにしておくことで期限が半分過ぎた後にアクセスがあると、新しいCookieを発行してくれるようになります。
(レスポンスヘッダの”Set-Cookie”に新しいCookieが付与される)

<authentication mode="Forms">
  <forms name="sample" timeout="1440" cookieless="UseCookies" slidingExpiration="true" />
</authentication>

さてブラウザ等はこの辺の処理を自動的にやってくれますが、アプリだと手動でやらないといけませんね。
ではEntityFrameworkではどうでしょう?

うーんそのまんまだとCookieどころかHTTPのレスポンスさえ見れませんね。
じゃぁどうしよう?と調べたところエンティティをQueryOperationResponseにキャストしてあげると良いみたいです。こんな感じ↓

ServiceReference1.Entities context = new ServiceReference1.Entities(new Uri("http://localhost/test.svc"));
context.MergeOption = MergeOption.NoTracking;
context.IgnoreMissingProperties = true;

var nodes = context.Users;

QueryOperationResponse<ServiceReference1.Users> response = nodes.Execute() as QueryOperationResponse<ServiceReference1.Users>;
if (response.Headers.Keys.Contains("Set-Cookie"))
{
    //response.Headers["Set-Cookie"] に新しいCookieが入ってる
}

foreach (var user in response)
{

	Console.WriteLine(user.DisplayName);
}

Cookieの有効期限が半分以上過ぎてからアクセスすると、レスポンスヘッダにちゃんとSet-Cookieが付与されているのがわかりますね。
あとはこの値をゴニョゴニョしておけばOKです。
※WCF Data Servicesで認証Cookie以外のCookieははかないと思いますが…一応注意ください。

これでForm認証するWCF Data Servicesとクライアントはばっちり?ですね!

WCF Data Services の通信を圧縮する

WCF Data ServicesはHTTPベース(ODataやJSON等)を使用してデータの送受信ができる強力な仕組みです。このあたりの説明はとりあえず割愛。

で、便利が故にぽんぽん使ってるとそれなりに転送量や帯域も消費するわけでして。でHTTPベースであればgzipで圧縮して通信したいと思うのが世の常。

というわけでさくっとgzip圧縮する方法です。

続きを読む

Azure AppFabric ACS v1+ADFS+WCF Data Services (2)

前回の続きです。前回はこちら → Azure AppFabric ACS v1+ADFS+WCF Data Services

今回は実際にフェデレーション認証を利用するサービスとクライアントを作成します。
サービス側はWCF Data Servicesを利用して、トークンが有効な場合のみデータ(Entity)を返すようにします。
クライアントはActive Federation認証を行いますので、ADFS2.0とACSv1を使用し得られたトークンと利用してWCF Data Servicesにアクセスしデータを取得します。

ではまずサービス側から。

続きを読む

Azure AppFabric ACS v1+ADFS+WCF Data Services

今日はWindows Azure AppFabric Access Controle Service v1 (現行)(以下ACSv1)とActive Directory Federation Services 2.0 (以下ADFS)を組み合わせてWCF Data ServicesをActive Federation認証してみようと思います。

WCF Data Servicesを利用するクライアントは今回はブラウザではなく、Windowsアプリとします。なのでブラウザが自動リダイレクトして認証画面に飛ぶようなPassive Federation認証ではなくActive Federation認証です。(自前でトークンのやり取りします)

そもそも、現行のACSv1はPassive Federationに対応していませんし、マルチテナントを考えるとちょっとWindows Identity Foundation(以下WIF)についてるFederation Utilityは使えないのでほぼコードでいろいろ制御することにします。

はっきりいって、ACSv2が出るまでのつなぎですね。ちなみに今回のネタはWIF トレーニングキットに付属するハンズオンラボ(IntroAppFabricAccessControl)を見ながらやればある程度できると思います。

今回想定している環境はこんな感じです。

※見ての通り(?)、WCF Data ServicesとSQL ServerはWindows Azure+SQL Azureでもまったく問題ありません。

では準備から。

続きを読む

WCF Data Services の続き

前回のPOSTで書き忘れたこと。

インターセプターを使えば特定の列だけ値を変える等できます。OData and Authentication – Part 7 – Forms Authentication にも記載されていますが、たとえば認証されているときだけセンシティブな情報を返すとか。

認証ユーザーやロールに応じて1つのWCF Data Services で柔軟に操作範囲を変えたりできるのはすごく便利ですね。

あと忘れてましたがASP.NET開発環境だとうまくフォーム認証が動きませんでした。(.adxが見れない?)このあたりあまり情報なくてちょっと諦め気味…
面倒だけどデバッグはIISのワーカープロセスにアタッチする等したほうがいいのかも…?
またSQL Serverへの接続は手抜きですが、アプリケーションプールのユーザー等にアクセス権限無いと無駄に怒られますので注意。

最後に追加でいろいろリンクを置いておきます。