我在单个生产环境中遇到了一个非常棘手的问题。
您有两个用户,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
与此时的名称不同。
答案 0 :(得分:1)
您的依赖方和STS(WIF)服务器是否使用相同的应用程序池托管在同一IIS上?如果是,那么尝试使用不同的应用程序池,因为工作进程有时会用来搞乱事情。希望这会对你有所帮助。
答案 1 :(得分:0)
我见过类似的问题。我们决定改变IIS和代码中的兑现。兑现导致安全性似乎搞砸了,但服务器只是存储生成的html的最后结果,使得它看起来像用户A登录而不是用户B.希望这有助于一些。
答案 2 :(得分:0)
如果您发布了有关任何Web配置设置以及IIS配置和.NET Framework版本的其他信息,将会有所帮助。对我而言,这听起来像应用程序池问题,但对您的系统知之甚少。如果应用程序池标识是自定义的,那么当然访问同一用户,除非设置了本地系统或模拟。如果这不是问题,请检查您的授权设置,并确保关闭anonynous和basic,或者应用程序所需的任何内容。