以下のスニペットに似たコードがあります ( http://leastprivilege.com/2009/05/24/use-geneva-session-management-for-your-own-needs/から取得)
public class Transformer : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate(string endpointUri, IClaimsPrincipal incomingPrincipal)
{
var claimName = "customClaimType";
// expensive operation
var claimValue = [from expensive operation];
incomingPrincipal.Identities[0].Claims.Add(new
Claim(claimName, claimValue));
return incomingPrincipal;
}
}
また、記事 ( http://leastprivilege.com/2009/05/24/use-geneva-session-management-for-your-own-needs/ ) で Dominick は、これらを取得したくない場合は次のように指摘しています。 (高価な) 要求ごとにデータ ストアからの要求を行う必要がある場合は、SAM (SessionAuthenticationModule) を利用できます。ただし、ID に対してこのクレームが既に存在するかどうかを確認し、存在しない場合にのみクレームをフェッチすることはできないでしょうか? これでパフォーマンスの問題は解決しませんか?
public class Transformer : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate(string endpointUri, IClaimsPrincipal incomingPrincipal)
{
var claimName = "customClaimType";
if(incomingPrincipal.Identities[0].Claims.Where(x => x.ClaimType == claimName).Count() <= 0)
{
// expensive operation
var claimValue = [from expensive operation];
incomingPrincipal.Identities[0].Claims.Add(new
Claim(claimName, claimValue));
}
return incomingPrincipal;
}
}
SessionAuthenticationModule に頼らなければならない理由がわかりません。そこで、ローカル マシンで上記のコードを試し、それをステップ実行して、後続の要求 (最初の要求の後) で高価な操作が呼び出されないことを確認しました。これが、負荷分散された環境 (Web ファーム) に当てはまるのか、それともシングル サインオン構造を共有する複数の依存者が関与する真のフェデレーション グループに当てはまるのかはわかりません。
これをよりよく理解するのに役立つ説明を本当に感謝します。
ありがとう!-カルティ。