我有一个问题发生在一个非常令人头疼的单一生产环境中。
您有两个用户,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
与此时应该使用的名称不同。