获取OAuth会话的到期时间

时间:2014-04-03 06:47:42

标签: c# oauth owin asp.net-web-api2

要授予或撤消对我的webapis的访问权限,我使用OAuth密码和tokenrefreshworkflow。

如果我理解正确的一切,工作流程应该是这样的:

  1. 使用用户名/密码/客户端ID进行身份验证
  2. 检索accestoken,refreshtoken和过期日期
  3. 在客户端启动超时以在到期令牌时间后刷新令牌
  4. 继续使用子弹2 - >等等..
  5. 到目前为止,上述进展正常。我的问题是,在身份验证请求之后,我没有从用户原则中获得过期时间。因此,如果我使用stateles webclients,我需要更新我的令牌以检索新的过期日期,即使用户令牌有效:/

    我想要的是/ api / session / information服务,提供有关经过身份验证的用户的当前会话的一般信息。

    如何检索过期日期=)

    [HttpGet]
    [ActionName("information")]
    public HttpResponseMessage Information(BaseRequest request)
    {
    
        var p = Request.GetRequestContext().Principal;
    
        /* here i need help =) */
    }
    

3 个答案:

答案 0 :(得分:4)

您的访问令牌(JWT?)应包含到期声明。在JWT中它是" exp",它显示了自1970-1-1以来的秒数。在javascript中,你可以这样得到一个日期:

new Date(<exp> * 1000);

在.Net / C#中你可以这样做:

var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(<exp>);

这是你在找什么?否则请告诉我。很乐意提供帮助: - )

答案 1 :(得分:1)

只需稍微扩大一下Henrik N.的答案即可。如果您使用的是C#,则可以在JWTSecurityTokenHandler(Nuget:System.IdentityModel.Tokens.Jwt)内使用Install-Package System.IdentityModel.Tokens.Jwt来读取令牌,并且生成的JwtSecurityToken对象为您提供一些方便的属性,一个其中的ValidTo可以将exp声明转换为DateTime对象,例如:

var tokenString = GetTokenString(); // Arbitrary method to get the token
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadToken(tokenString) as JwtSecurityToken;
var tokenExpiryDate = token.ValidTo;

// If there is no valid `exp` claim then `ValidTo` returns DateTime.MinValue
if(tokenExpiryDate == DateTime.MinValue) throw new Exception("Could not get exp claim from token");

// If the token is in the past then you can't use it
if(tokenExpiryDate < DateTime.UtcNow) throw new Exception($"Token expired on: {tokenExpiryDate}");

// Token is valid

答案 2 :(得分:1)

您可以使用DateTimeOffset.FromUnixTimeSeconds:

   var jwtExpValue = long.Parse(principal.Claims.FirstOrDefault(x => x.Type == "exp").Value);
   DateTime expirationTime = DateTimeOffset.FromUnixTimeSeconds(jwtExpValue).DateTime;