通常、一度だけ転送され、リダイレクト ダンス (パッシブ リダイレクト) が発生し、トークンを取得します。通常、トークンは暗号化された形式で Cookie にキャッシュされます。したがって、後続のリクエストはリダイレクト ダンスを行いません。
ここでの課題は、Cookie が暗号化されているため、Web ファーム内のすべてのサーバーが解読するための暗号化キーを持っている必要があることです。初期状態では、WIF はデフォルトで DPAPI に設定されているため、問題が発生します。このタイプの暗号化は、マシンごとに意図的に異なります。それは雲の中で壊れます。
必要なことは、展開の一部としてサービス証明書をアップロードし、Cookie の暗号化方法を webfarm に適したものに変更することです。魔法のコードは次のとおりです。
private void OnServiceConfigurationCreated(object sender,
ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms =
new List<CookieTransform>(
new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(
e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(
e.ServiceConfiguration.ServiceCertificate)
});
var sessionHandler = new
SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(
sessionHandler);
}
これにより、セキュリティ トークン ハンドラーが、インストールされた証明書から派生したキー マテリアルで RSA 暗号化を使用するように設定されます。
このサンプル アプリケーションには、問題と解決策を示す詳細と情報が記載されています。
http://msdn.microsoft.com/en-us/library/ff966481.aspx
追加編集:
ASP.NET には、WIF が構成されているパイプラインがあります。認証イベントをフックし、Cookie からトークンを取得して IPrincipal を構築し、後続のコードがそれをコンテキスト内に持つようにします。通常、STS を使用する場合、プリンシパルを自分で構築することはありません。代わりに、プリンシパルを変更する必要がある場合は、WIF のパイプラインにプラグインし、追加のクレームを「ロール」クレーム (実際には URI 名前空間) に挿入します。次に、WIF はこれらのクレームを使用して、ロールなどを含む ClaimsPrincipal を構築し、機能するもの (IsInRole、web.config auth など) を作成します。
可能であれば、ロールをクレームとしてトークンに含めることをお勧めします。これはかなり長い議論ですが、意味のあるコンテキストに対するクレームの「正規化」に関するものです。IP-STS から得られるクレームは独自の用語であり、アプリケーションにとっては何の意味もない可能性があることに注意してください。たとえば、Adatum\Managers グループに属しているという顧客からのクレームを受け取る場合があります。それは私のアプリケーションにとってはまったく意味がないので、私が通常行うことは、そのトークンをアプリが理解できるものに交換し、その過程でクレーム マッピング (つまり、Adatum\Managers --> MyApplicationAdminRole) によってクレームを変換または正規化することです。Windows Azure ACS サービスは、これを行うのに非常に適しています (異なる IP からのクレームを正規化します)。
ここで一般的なパターンを取得するには、これに関するVittorio の本を読むことをお勧めします。
Eugenio のメモ:
@dunnry が書いたものに追加します。これはすべて正しいです。Relying Party (Web アプリ) でクレーム セットを拡張するための適切な拡張ポイントは、ClaimsAuthenticationManagerを使用することです。このタイプのドキュメントはこちらです。そのページにはサンプルへのポインタがあります。そのクラスでは、XML ファイルからロールを読み取り、それらを ClaimsIdentity に追加します。アプリの残りの部分は、クレームなどについて心配しません (特に、あなたの場合のようにロールを使用している場合)。Cookie 暗号化の RSA 構成は、ロード バランサーの問題を解決します。