ASP.NET アプリケーションが STS (Thinktecture IdentityServer) に対して認証できるように、WS フェデレーションで WIF を使用しています。私の RP では、ユーザーの主張に基づいて Cookie の永続性を実用的に設定したいと考えています。
Fiddler でトラフィックを監視すると、STS トークンが RP にポストされると、WIF FedAuth Cookie が最初に設定されることがわかります。Cookie が設定される前に、いくつかのイベントをインターセプトし、現在のクレームに応じて Cookie を永続的に (または永続的にしないように) 設定したいと考えています。
web.config で Cookie の永続性を設定できることは理解していますが、この動作はユーザーに基づいて条件付きにする必要があります。
<wsFederation ... persistentCookiesOnPassiveRedirects="true" />
私の最初のアプローチは、さまざまな SessionSecurityTokenCreated イベントを処理することでしたが、これらのイベントは決して発生しなかったようです。 ハンドラーを間違って追加していませんか? または、これを行うより良い方法はありますか?
protected void Application_Start()
{
...
FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenCreated +=
new EventHandler<SessionSecurityTokenCreatedEventArgs>(SessionAuthenticationModule_SessionSecurityTokenCreated);
FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated +=
new EventHandler<SessionSecurityTokenCreatedEventArgs>(WSFederationAuthenticationModule_SessionSecurityTokenCreated);
}
//This never seems to fire...
void SessionAuthenticationModule_SessionSecurityTokenCreated(object sender,
SessionSecurityTokenCreatedEventArgs e)
{
if (e.SessionToken.ClaimsPrincipal.HasClaim("someClaim", "someValue"))
e.SessionToken.IsPersistent = true;
else
e.SessionToken.IsPersistent = false;
}
//This never seems to fire either...
void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender,
SessionSecurityTokenCreatedEventArgs e)
{
if (e.SessionToken.ClaimsPrincipal.HasClaim("someClaim", "someValue"))
e.SessionToken.IsPersistent = true;
else
e.SessionToken.IsPersistent = false;
}
興味深いことに、SessionAuthenticationModule_SessionSecurityTokenReceived のハンドラーを追加すると、このイベントが発生するようです。ここで、Cookie を再発行してIsPersistent = trueを設定できますが、これは Cookie が最初に設定されるまで起動されないため、Cookie が最初に発行されたときにこれを行うことをお勧めします。
少しテストした後: SessionAuthenticationModule_SessionSecurityTokenReceived で Cookie を再発行すると、SessionAuthenticationModule_SessionSecurityTokenCreated が起動されます。トークンが最初に RP に POST されたときに、Cookie の最初の作成時にこれが起動されない理由がわかりません。