10

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

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

4

3 回答 3

1

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

于 2014-01-26T09:02:03.893 回答
0

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

于 2013-04-01T17:29:31.260 回答
0

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

于 2014-03-05T20:53:54.850 回答