Windows Identity Foundation(WIF) - ClaimsAuthenticationManager

时间:2012-04-14 15:22:32

标签: wif

我的代码类似于下面的代码段(取自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。

2 个答案:

答案 0 :(得分:0)

我认为你已经回答了自己的问题。与Dominick的方法的简单区别在于,额外的“http://声明/昂贵”声明正在会话cookie中缓存,但是建议的解决方案不是。

答案 1 :(得分:0)

我误解了多米尼克的文章。他的文章是关于使用WIF的SessionAuthenticationModule为您的目的。如果您正在使用带有WS-Fed的WIF,那么您可以立即获得此行为。

想到我已经清楚了......