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

Aar*_*n M 10 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*a G 0

我见过类似的问题。我们通过更改 IIS 和代码中的兑现解决了这个问题。兑现导致安全性似乎混乱,但服务器只是存储生成的 html 的最后结果,使其看起来像是用户 A 已登录,而不是用户 B。希望这对一些人有帮助。