0

我的代码类似于下面的代码片段(取自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。所以我在我的本地机器上尝试了上面的代码,并逐步验证了后续请求(在初始请求之后),不会调用昂贵的操作。现在我不确定这是在负载平衡环境(网络场)中还是在涉及共享单点登录结构的多个依赖方的真正联合组中的情况。

我真的很感激能帮助我更好地理解这一点的解释。

谢谢!-卡西。

4

2 回答 2

0

我想你已经回答了你自己的问题。与 Dominick 方法的简单区别在于,附加的“http://claims/expensive”声明被缓存在会话 cookie 中,但对于您提出的解决方案,它不是。

于 2012-04-16T15:42:37.437 回答
0

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

只是以为我会澄清这一点...

于 2012-04-19T14:20:31.497 回答