如何设置Fedauth Cookie sessionToken.SessionsecurityTokencencence



我正在将WIF与WS联邦使用WIF,以便我的ASP.NET应用程序可以针对STS进行身份验证(ThinkTecture IdentityServer)。在我的RP中,我想务实地基于用户的主张来设置cookie的持久性。

观看提琴手的流量,我可以看到Wif Fedauth Cookie首次将STS令牌发布到RP时。在设置cookie之前,我想拦截一些事件,然后根据当前的索赔设置cookie持久(或不)。

我知道我可以在web.config中设置cookie的持久性,但是此行为必须基于用户的条件。

<wsFederation ... persistentCookiesOnPassiveRedirects="true" />

我的第一种方法是尝试处理各种会议的事件,但是这些事件似乎从未被解雇。我是否错误地添加了处理程序?还是有更好的方法?

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_sessionsecurityTokenReceive添加了一个处理程序,则此事件似乎会开火。在这里,我可以重新发出cookie并设置 iSPERSISTENT = TRUE ,但是直到第一次设置Cookie之后,这才会被触发,并且在首次发出cookie时,我更喜欢这样做。

进行了一些测试之后:如果我在SessionAuthentication Module_sessionsecurityTokenReceived中重新发出cookie,则将解雇sessionauthenticationmodule_sessionsecuritytokencreated。我似乎找不到当令牌首次发布到RP时,为什么在cookie的初始创建中没有解雇这一点。

我问题的来源是: 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;            
}

相关内容

  • 没有找到相关文章

最新更新