2

我有一个托管在 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)并让他们重新进行身份验证

我需要一些指导的是,当用户的声明由于非用户发起的事件而发生变化时,如何/何时刷新用户声明。

想象以下场景:

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

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

在这两种情况下,如果用户自己注销并重新登录,问题就会自行解决。但是,如果用户没有采取特定操作退出,他的 cookie 包含无效声明。

您如何处理此类案件?

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

有更好或不同的策略吗?

任何指导将不胜感激。

谢谢。

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

  1. 使用会话身份验证模块 (SAM) 时如何更新声明
  2. 使用 ADFS 和 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
4

1 回答 1

1

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

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

换句话说,而不是

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

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

于 2017-09-21T10:46:14.143 回答