3

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 の最初の作成時にこれが起動されない理由がわかりません。

4

1 に答える 1

2

私の問題の原因は次のとおりです。a) カスタムの WSFederationAuthenticationModule を使用していました。b) カスタム モジュールの名前を使用して、Global.asax 内のイベントを関連付けていませんでした。

私のweb.configにこれがあると仮定します:

<system.webServer>

// ...

    <add name="MyCustomWSFederationAuthenticationModule"
     type="MyLib.MyCustomWSFederationAuthenticationModule, Thinktecture.IdentityModel, Version=1.0.0.0, Culture=neutral"
     preCondition="managedHandler" />

    <add name="SessionAuthenticationModule"
     type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
     preCondition="managedHandler"  />


// ...

</system.webServer>

また、「MyCustomWSFederationAuthenticationModule」がカスタムの fed-auth モジュールの名前であると仮定します。次に、メソッド ハンドラーの名前を修正する必要がありました (アプリの開始には何もありません)。

protected void Application_Start()
{
    //Nothing here.
}

//This never seems to fire either...
void MyCustomWSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender,
        SessionSecurityTokenCreatedEventArgs e)
{
    if (e.SessionToken.ClaimsPrincipal.HasClaim("someClaim", "someValue"))
        e.SessionToken.IsPersistent = true;
    else
        e.SessionToken.IsPersistent = false;            
}
于 2012-11-08T21:28:02.977 に答える