当第二个用户登录时,ContextSessionSecurityToken被覆盖

时间:2013-02-20 18:05:59

标签: c# .net wif

我在单个生产环境中遇到了一个非常棘手的问题。

您有两个用户,A和B.用户A登录,一切正常。用户B登录,用户B登录后,用户A现在拥有与用户B相同的安全令牌。

我们的WIF设置是相当标准的,我们在令牌上注入一些自定义声明,但其他所有内容看起来都是标准,就令牌的创建和存储方式而言(由WIF处理)。

感觉我可能遇到了一些我不熟悉的WIF奇怪的边缘情况

更新:A和B都可以位于不同的计算机上,也可以位于同一台计算机上的不同浏览器中。

我们在请求服务时获取令牌

if (HttpContext.Current == null)
    return null;

if (HttpContext.Current.Cache == null)
    return null;

if (FederatedAuthentication.SessionAuthenticationModule == null)
    return null;

if (FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken == null)
    return null;

var sessionToken = FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken;
if (sessionToken.ClaimsPrincipal == null)
    throw new InvalidOperationException("The ClaimsPrincipal property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null");
if (sessionToken.ClaimsPrincipal.Identities == null)
    throw new InvalidOperationException("The ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null");
if (sessionToken.ClaimsPrincipal.Identities.Count == 0)
    throw new InvalidOperationException("The ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object has no identities");
if (sessionToken.ClaimsPrincipal.Identities[0] == null)
    throw new InvalidOperationException("The first identity in the ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object is null");
if (sessionToken.ClaimsPrincipal.Identities[0].Claims == null)
    throw new InvalidOperationException("The first identity in the ClaimsPrincipal.Identities sub-property of the FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken object as a null Claims property");

return TokenUtility.GetDelegatedToken(IssuedTokenTypes.UserProfile | IssuedTokenTypes.AccountPermissions, sessionToken);

如果我在这里添加日志记录,我可以看到sessionToken.ClaimsPrincipal.Identity.Name与此时的名称不同。

3 个答案:

答案 0 :(得分:1)

您的依赖方和STS(WIF)服务器是否使用相同的应用程序池托管在同一IIS上?如果是,那么尝试使用不同的应用程序池,因为工作进程有时会用来搞乱事情。希望这会对你有所帮助。

答案 1 :(得分:0)

我见过类似的问题。我们决定改变IIS和代码中的兑现。兑现导致安全性似乎搞砸了,但服务器只是存储生成的html的最后结果,使得它看起来像用户A登录而不是用户B.希望这有助于一些。

答案 2 :(得分:0)

如果您发布了有关任何Web配置设置以及IIS配置和.NET Framework版本的其他信息,将会有所帮助。对我而言,这听起来像应用程序池问题,但对您的系统知之甚少。如果应用程序池标识是自定义的,那么当然访问同一用户,除非设置了本地系统或模拟。如果这不是问题,请检查您的授权设置,并确保关闭anonynous和basic,或者应用程序所需的任何内容。