Windows Identity Foundation (WIF) - ClaimsAuthenticationMana



我有类似于以下代码片段的代码(取自 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,则可以立即获得此行为。

只是以为我会清除它...

相关内容

  • 没有找到相关文章

最新更新