我在单个生产环境中遇到了一个非常棘手的问题.
你有两个用户,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与此时的名称不同.
我见过类似的问题。我们通过更改 IIS 和代码中的兑现解决了这个问题。兑现导致安全性似乎混乱,但服务器只是存储生成的 html 的最后结果,使其看起来像是用户 A 已登录,而不是用户 B。希望这对一些人有帮助。
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |