我有类似于以下代码片段的代码(取自 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 场)中还是在涉及共享单一登录结构的多个信赖方的真正联合组中,情况是否如此。
我真的很感激一个能帮助我更好地理解这一点的解释。
谢谢!-卡蒂。
我想你已经直接回答了你自己的问题。与 Dominick 方法的简单区别是,额外的"http://claims/expensive"声明被缓存在会话 cookie 中,但对于您提出的解决方案,它不是。
我误解了多米尼克的文章。 他的文章是关于使用 WIF 的 SessionAuthenticationModule 来实现您的目的。 如果您使用的是带有WS-Fed的WIF,则可以立即获得此行为。
只是以为我会清除它...