JWT Token身份验证,过期令牌仍在工作,.net核心Web Api

Dar*_*Jam 9 authentication token jwt .net-core

我正在构建一个.net核心web api.

前言 - 我已根据https://stormpath.com/blog/token-authentication-asp-net-corehttps://dev.to/samueleresca/developing-token-authentication-using-aspnet-实施了令牌身份验证核心.我还在github上阅读了一些问题,在这里也是如此.

这也派上用场了https://goblincoding.com/2016/07/24/asp-net-core-policy-based-authorisation-using-json-web-tokens/.

实施之后,我感觉我错过了一些东西.

我创建了一个位于Web客户端的简单Angular应用程序.当我进行身份验证时,会向客户端发送令牌.我现在将它存储在会话中(仍然在开发中,因此将解决以后存储它的安全问题).

不确定这个(JWT(JSON Web Token)自动延长到期时间)是有用的,因为我没有实现刷新令牌,据我所见.

我注意到,当我调用logout,然后再次重新登录时,会向客户端发送一个新令牌 - 正如预期的那样.但是,如果令牌到期时间已过(我将其设置为1分钟进行测试)然后刷新页面,则令牌似乎在我的应用程序中保持不变.即好像令牌永不过期?!

我本来希望客户端返回401 Unauthorized错误,然后我可以处理强制用户重新进行身份验证.

这不是这应该如何工作?是否有一些自动刷新令牌魔法在默认的背景中进行(我没有在教程中明确设置任何刷新令牌的概念)?或者我错过了一些关于令牌身份验证的概念?

此外 - 如果这是一个永久刷新的令牌,如果令牌被泄露,我是否应该关注安全性?

谢谢你的帮助

DJD*_*JDJ 25

我相信这与JwtBearerOptions中的ClockSkew有关.

更改为TimeSpan.Zero,因为我认为默认设置为5分钟(尽管不是100%肯定).

我在下面发布了一些示例代码,放在Startup.cs => Configure中.

        app.UseJwtBearerAuthentication(new JwtBearerOptions()
        {
            AuthenticationScheme = "Jwt",
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidAudience = Configuration["Tokens:Audience"],
                ValidIssuer = Configuration["Tokens:Issuer"],
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
                ValidateLifetime = true,
                ClockSkew = TimeSpan.Zero
            }
        });
Run Code Online (Sandbox Code Playgroud)


Thi*_*rry 12

如果您的到期时间是远远超过默认值(5分钟),或在一组像我时间了,它仍然认为过期的标记为有效,并设置ClockSkewTimeSpan.Zero没有任何影响,请确保您有属性

ValidateLifetime 
Run Code Online (Sandbox Code Playgroud)

设置true为我已经设置为false导致问题的原因,这完全有道理,但这是一个简单的疏忽。

services.AddAuthentication(option =>
    {
        option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["JwtToken:Issuer"],
            ValidAudience = Configuration["JwtToken:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(
               Encoding.UTF8.GetBytes(Configuration["JwtToken:SecretKey"]))
        };
    });
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,我需要使用 Core 2.2 的 ValidateLifetime 和 ClockSkew (5认同)

小智 8

图书馆本身还有 5 分钟的额外延迟。

如果您将到期时间设置为 1 分钟,则总数将为 6 分钟。如果您设置为 1 小时,则总数将为 1 小时 5 分钟。

  • *图书馆本身额外延迟 5 分钟*是什么意思?您的意思是除了已经提到的“ClockSkew”之外吗? (2认同)