我的代码类似于下面的代码段(取自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。所以我在我的本地机器上尝试了上面的代码,然后我逐步完成它以验证后续请求(在初始请求之后),不会调用昂贵的操作。现在我不确定负载均衡环境(Web场)或真正联合组中是否会出现这种情况,涉及多个依赖方共享单点登录结构。
我真的很感激能够帮助我更好地理解这一点的解释。
谢谢! -Karthi。
答案 0 :(得分:0)
我认为你已经回答了自己的问题。与Dominick的方法的简单区别在于,额外的“http://声明/昂贵”声明正在会话cookie中缓存,但是建议的解决方案不是。
答案 1 :(得分:0)
我误解了多米尼克的文章。他的文章是关于使用WIF的SessionAuthenticationModule为您的目的。如果您正在使用带有WS-Fed的WIF,那么您可以立即获得此行为。
想到我已经清楚了......