在多个虚拟应用程序(但相同的域)上共享ADFS / WIF联合声明cookie

时间:2014-04-09 09:47:23

标签: asp.net cookies wif claims-based-identity adfs2.0

我试图(重新)对同一域上运行的多个不同应用程序使用基于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中的方法之前,我甚至可能尝试实现的目标吗?

提前致谢!

3 个答案:

答案 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 中的验证通过。