【问题标题】:How do I evaluate the expiration date on a ClaimsPrincipal?如何评估 ClaimsPrincipal 的到期日期?
【发布时间】:2021-08-09 04:32:22
【问题描述】:

我正在尝试读取 .NET 服务器应用程序中 ClaimsPrincipal 的到期日期。

我想我明白如何获得它了:

Claim exp = accessClaimsPrincipal.FindFirst("exp");

这给了我一个 Claim 对象。我可以获得 Claim 对象的 .Value,它给了我一个字符串。但是,我需要的是一个 DateTime 对象。如何将此声明转换为日期时间?

【问题讨论】:

    标签: c# .net claims-based-identity


    【解决方案1】:

    exp 声明是自 1970 年以来的秒数,而不是滴答声。参考:https://datatracker.ietf.org/doc/html/rfc7519#section-2 -> NumericDate

    所以要解析它,使用:

    var exp = DateTimeOffset.FromUnixTimeSeconds(long.Parse(accessClaimsPrincipal.FindFirst("exp").Value));
    //or as DateTime:
    DateTime result = exp.UtcDateTime;
    

    【讨论】:

      【解决方案2】:

      根据rfc7519 应该是一个数字日期值(又名刻度)。例如637553398040000000

      “exp”(过期时间)声明标识过期时间 或者在此之后,JWT 不得被接受处理。这 处理“exp”声明需要当前日期/时间 必须早于“exp”声明中列出的到期日期/时间。

      实施者可以提供一些小的回旋余地,通常不超过 几分钟,以解决时钟偏差。它的值必须是一个数字 包含 NumericDate 值。使用此声明是可选的。

      所以它需要先解析为long,然后再转换为DateTime

      Claim exp = accessClaimsPrincipal.FindFirst("exp");
      var expDate = new DateTime(long.Parse(exp.Value));
      

      【讨论】:

      • 替代方案:如果字符串值有时区(或者您知道时区),请使用 DateTimeOffset。
      • @gunr2171 值得注意,但可能与答案无关。另外,我不推荐DateTimeOffset,除非您实际处理偏移量......如果我要对此事提出关注或认识,我只是提请注意DateTimeKind link - 处理未指定,UTC 或与解析相关的本地化。
      • 实际上,我收回了.. 根据Choosing Between Datetime,对于应用程序开发,默认应该是DateTimeOffset - 这似乎也是一个很好的场景,否则你不会在这里接受歧义。所以我同意,这个答案可能会通过引用 DateTimeOffset 类型而不是 DateTime 来改进。对不起,冗长的评论。
      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多