【发布时间】:2012-04-14 15:22:32
【问题描述】:
我有类似于下面sn-p的代码(取自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。所以我在我的本地机器上尝试了上面的代码,并逐步验证了后续请求(在初始请求之后),不会调用昂贵的操作。现在我不确定这是在负载平衡环境(网络场)中还是在涉及共享单点登录结构的多个依赖方的真正联合组中的情况。
我非常感谢能帮助我更好地理解这一点的解释。
谢谢! -卡西。
【问题讨论】:
标签: wif