OAuth JWT 访问令牌过期取决于客户端类型

OAuth JWT access token expiration depending on type of client

我基于 Taiseer's tutorial 创建了一个 JWT 令牌实现。

以下代码已添加到我的 Owin 启动程序中 class:

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    AllowInsecureHttp = HttpContext.Current.IsDebuggingEnabled,
    TokenEndpointPath = new PathString("/oauth2/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(90),
    Provider = new CustomOAuthProvider(),
    AccessTokenFormat = new CustomJwtFormat("http://example.com/")
};

现在有不同类型的应用程序使用 API。对于 Web 客户端,90 分钟的过期时间就足够了,但对于移动应用程序来说,这太短了。

有没有办法让移动应用程序的令牌在 1 年后过期?我可以使用自定义 HTTP headers 来区分应用程序的类型。我试图在我的 CustomJwtFormat class 的 Protect 方法中延长到期时间,这确实允许 JWT 中有更大的到期时间。

public class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket> {

    public string Protect(AuthenticationTicket data) {
        ... emitted for brevity ...

        string appId = HttpContext.Current.Request.Headers.GetValues("my-custom-header").FirstOrDefault();
        if (appId == null)
            throw new ApplicationException("Application ID header is missing");

        if (appId.ToLower() == "mobileappheader") { 
            // set expiration to 1 year
            expires = DateTimeOffset.UtcNow.AddYears(1);
        }

        var token = new JwtSecurityToken(issuer, audienceId, data.Identity.Claims, 
                      issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingkey);

但在授权响应中,它仍然说 90 分钟:

{
    "access_token": "eyJ0eX...0CLY6jU",
    "token_type": "bearer",
    "expires_in": 5399
}

如您所见,expires_in 仍设置为 90 分钟时间跨度。

尽管服务器的响应指示 90 分钟到期,ASP.NET web api 会查看票据内部以确定到期时间。因此,如果我将其默认设置为 90 分钟(在 startup.cs 中)并将我的移动应用程序设置为 1 年,那么我的移动应用程序将有 1 年的有效期。