我正在将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;
}