在被动场景中刷新声明的适当策略是什么?

时间:2013-03-26 03:49:05

标签: .net-4.5 wif claims-based-identity

我在Windows Azure中托管了一个.NET 4.5声明感知应用程序。有一个托管MVC站点的Web角色和一个在后台运行作业的辅助角色。用户可以选择永久登录。

以下是来自ClaimsAuthenticationManager的代码:

public ClaimsPrincipal LogIn(string username, bool rememberMe = false)
{
    ClaimsPrincipal principal = Authenticate(null, principalFactory.CreateFormsPrincipal(username));
    SetSessionCookie(principal, rememberMe ? TimeSpan.MaxValue : TimeSpan.FromDays(1));
    return principal;
}

public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
    if (!incomingPrincipal.Identity.IsAuthenticated)
    {
        return base.Authenticate(resourceName, incomingPrincipal);
    }

    return principalFactory.Create(incomingPrincipal.Identity.Name, incomingPrincipal.Identity.AuthenticationType);
}

private static void SetSessionCookie(ClaimsPrincipal principal, TimeSpan lifetime)
{
    var sessionSecurityToken = new SessionSecurityToken(principal, lifetime)
        {
            IsReferenceMode = true
        };
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken);
}

在用户在网站上执行操作(例如,购买/取消订阅)的简单刷新情况下,可以通过以下方式完成:

  1. 发出新令牌并重写cookie或
  2. 将用户注销(删除cookie)并让他们重新进行身份验证
  3. 我需要一些指导,就是如何/何时在非用户发起的事件发生变化时刷新用户的声明。

    想象一下以下场景:

    1. 用户指定“记住我”并成功登录。他现在有一个永不过期的cookie。然后他通过网站购买订阅。他的主张通过上面的选项#1刷新。一个月后,他的订阅失效,因为他选择不续约。但他的cookie仍然有效,与之相关的声明称他的订阅仍然有效。

    2. 新用户创建帐户并登录成功指定“记住我”。他现在有一个永不过期的cookie,其中包括一项声明,授予一些特殊功能的免费试用一周。一周后,后台作业(通过worker角色执行)删除了底层数据存储中的免费试用记录。但是,用户的cookie仍然有免费试用声明。

    3. 在这两种情况下,如果用户注销并自行返回,问题就会自行解决。但是,如果用户没有采取任何特定操作来注销,则他的cookie包含无效声明。

      你如何处理这类案件?

      由于我一直在撰写这个问题,我想到最合乎逻辑的做法是将cookie的到期日期设置为索赔集合中最短期索赔的预期生命周期。

      是否有更好或不同的策略?

      非常感谢任何指导。

      感谢。

      作为参考,我已阅读以下相关主题的帖子:

      1. How to update a claim when using Session Authentication Module (SAM)
      2. Updating claims with ADFS and WIF
      3. http://social.msdn.microsoft.com/Forums/en-US/Geneva/thread/bc1d21df-837e-4686-84cd-f918d26720a2
      4. http://social.msdn.microsoft.com/Forums/en-US/Geneva/thread/70edda22-c006-4868-8483-60067cc500b1

1 个答案:

答案 0 :(得分:1)

我知道这有点旧,但我相信对这两个问题的简短回答就是在Cookie中包含自定义声明和会话令牌。此自定义声明值将是订阅ID

根据任何敏感请求,将根据有效订阅列表检查订阅ID。

换句话说,而不是

  

最合乎逻辑的做法是将Cookie的到期日期设置为声明集合中最短期索赔的预期生命周期

它应该不仅仅依赖于来自cookie的会话令牌,而是根据需要经常验证权限,可能还有一些额外的声明可以使这种验证更便宜"。