第二个用户登录时将覆盖ContextSessionSecurityToken

本文关键字:覆盖 ContextSessionSecurityToken 用户 登录 第二个 | 更新日期: 2023-09-27 18:00:21

我在单个生产环境中遇到了一个非常令人头疼的问题。

你有两个用户,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与此时应该使用的名称不同。

第二个用户登录时将覆盖ContextSessionSecurityToken

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

我也看到过类似的问题。我们解决了在IIS和代码中更改兑现的问题。兑现导致安全性看起来一团糟,但服务器只是存储生成的html的最后结果,使其看起来像是用户A登录了,而不是用户B。希望这能有所帮助。

如果您发布一些关于任何web配置设置以及IIS配置和.NET Framework版本的附加信息,将会有所帮助。对我来说,这听起来像是一个应用程序池问题,但对您的系统了解极其有限。如果应用程序池标识是自定义的,那么当然可以访问同一用户,除非设置了localsystem或模拟。如果不是这个问题,请检查您的授权设置,并确保关闭了匿名和基本权限,或者您的应用程序可能需要的任何权限。