我的代码类似于下面的代码片段(取自http://leastprivilege.com/2009/05/24/use-geneva-session-management-for-your-own-needs/)
public class Transformer : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate(string endpointUri, IClaimsPrincipal incomingPrincipal)
{
var claimName = "customClaimType";
// expensive operation
var claimValue = [from expensive operation];
incomingPrincipal.Identities[0].Claims.Add(new
Claim(claimName, claimValue));
return incomingPrincipal;
}
}
在文章(http://leastprivilege.com/2009/05/24/use-geneva-session-management-for-your-own-needs/)中,Dominick 指出,如果我们不想检索这些(昂贵的)数据存储对每个请求的声明,然后我们可以使用 SAM(SessionAuthenticationModule)。但是,我们不能只检查该身份的声明是否已经存在,然后仅在不存在的情况下获取该声明吗?这不能解决性能问题吗?
public class Transformer : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate(string endpointUri, IClaimsPrincipal incomingPrincipal)
{
var claimName = "customClaimType";
if(incomingPrincipal.Identities[0].Claims.Where(x => x.ClaimType == claimName).Count() <= 0)
{
// expensive operation
var claimValue = [from expensive operation];
incomingPrincipal.Identities[0].Claims.Add(new
Claim(claimName, claimValue));
}
return incomingPrincipal;
}
}
我不明白为什么我们必须求助于 SessionAuthenticationModule。所以我在我的本地机器上尝试了上面的代码,并逐步验证了后续请求(在初始请求之后),不会调用昂贵的操作。现在我不确定这是在负载平衡环境(网络场)中还是在涉及共享单点登录结构的多个依赖方的真正联合组中的情况。
我真的很感激能帮助我更好地理解这一点的解释。
谢谢!-卡西。