我试图(重新)对同一域上运行的多个不同应用程序使用基于ADFS 2 / WIF声明的身份验证Cookie。
所以我有这些应用程序/虚拟目录,我想重用相同的身份验证cookie:
在门户网站中,我希望包含来自myapp的(客户端认证的)内容,因此我不希望每个应用都通过重定向到STS / ADFS来单独进行身份验证。
我认为这非常简单,因为他们可以访问相同的cookie,因为它们驻留在同一个域中,但cookie仅对其创建的应用程序有效(FedAuth和FedAuth1 cookie路径仅限于&# 34; / portal /")
当我设置'路径'在cookieHandler设置为" /",我将得到一个例外:
[SecurityTokenException: ID4291: The security token 'System.IdentityModel.Tokens.SessionSecurityToken' is not scoped to the current endpoint.]
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ValidateToken(SessionSecurityToken token, String endpointId) +1008632
System.IdentityModel.Services.SessionAuthenticationModule.ValidateSessionToken(SessionSecurityToken sessionSecurityToken) +351
System.IdentityModel.Services.SessionAuthenticationModule.SetPrincipalFromSessionToken(SessionSecurityToken sessionSecurityToken) +91
System.IdentityModel.Services.SessionAuthenticationModule.AuthenticateSessionSecurityToken(SessionSecurityToken sessionToken, Boolean writeCookie) +66
System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +929
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165
我尝试使用本文中提到的Microsoft.Owin.Security.WsFederation测试版软件包作为替代方案,但没有成功运行: http://blogs.msdn.com/b/webdev/archive/2014/02/21/using-claims-in-your-web-app-is-easier-with-the-new-owin-security-components.aspx
在我试图覆盖SessionSecurityTokenHandler中的方法之前,我甚至可能尝试实现的目标吗?
提前致谢!
答案 0 :(得分:4)
在system.identityModel.services中更改下面的cookieHandler - > federationConfiguration
<federatedAuthentication>
<cookieHandler requireSsl="true" path="/" />
</federatedAuthentication>
答案 1 :(得分:0)
实际上这很简单,只需将MachineKeySessionSecurityTokenHandler替换为可以摆脱令牌验证的自定义实现:
public class SharedSecurityTokenHandler : MachineKeySessionSecurityTokenHandler
public override ReadOnlyCollection<ClaimsIdentity> ValidateToken(SessionSecurityToken token, string endpointId)
{
if (token == null) throw new ArgumentNullException("token");
if (endpointId == null) throw new ArgumentNullException("endpointId");
return ValidateToken(token);
}
}
刚刚在web.config中注册它:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<add type="Security.Web.SharedSecurityTokenHandler, Security.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
答案 2 :(得分:0)
我一直在努力实现同样的目标,并发现 SessionAuthenticationModule.ValidateSessionToken(SessionSecurityToken sessionSecurityToken)调用:
securityTokenHandler.ValidateToken(sessionSecurityToken, this.CookieHandler.Path)
..第二个参数是 endpointId 。因此,使用以下命令配置我的应用程序:
<system.identityModel.services>
<federationConfiguration>
<cookieHandler domain="example.com" path="/" />
...
</federationConfiguration>
</system.identityModel.services>
..允许 MachineKeySessionSecurityTokenHandler 中的验证通过。