【问题标题】:Need to check of jwt token is valid/expired in asp.net core需要检查 jwt 令牌在 asp.net 核心中是否有效/过期
【发布时间】:2020-09-29 01:12:34
【问题描述】:

为了生成 JWT 令牌,我使用以下代码:

  var tokenHandler = new JwtSecurityTokenHandler();

            var key = Encoding.ASCII.GetBytes(_consumerConfiguration.SecretKey);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, "ConsumerId")
                }),
                Expires = DateTime.Now.AddMinutes(1),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return tokenHandler.WriteToken(token);

这是我在 RegisterServices 中的代码

  var appSettingsSection = configuration.GetSection("ConsumerConfiguration");
            services.Configure<ConsumerConfiguration>(appSettingsSection);

            var appSettings = appSettingsSection.Get<ConsumerConfiguration>();

            var key = Encoding.ASCII.GetBytes(appSettings.SecretKey);
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
            services.AddScoped<Microsoft.AspNetCore.Authorization.IAuthorizationHandler, ConsumerAuthorizationHandler>();

我使用它作为过滤器在应用程序中全局注册自定义授权处理程序:

 var policy = new AuthorizationPolicyBuilder().RequireCustomClaim(ClaimTypes.Name).
                AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme).Build();

options.Filters.Add(new AuthorizeFilter(policy));
            })

这是我的自定义授权处理程序

    #region constructor
    public ConsumerAuthorizationHandler(IOptions<ConsumerConfiguration> consumerConfiguration)
    {
        _consumerConfiguration = consumerConfiguration.Value;
    }
    #endregion
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRequireClaim requirement)
    {
        if (!_consumerConfiguration.EnableAuthorizationFilter)
            context.Succeed(requirement);

        var hasClaim = context.User.Claims.Any(x => x.Type == requirement.ClaimType);

        if (hasClaim)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

public static class AuthorizationPolicyBuilderExtensions
{
    public static AuthorizationPolicyBuilder RequireCustomClaim(this AuthorizationPolicyBuilder builder, string claimType)
    {
       return builder.AddRequirements(new CustomRequireClaim(claimType));
    }
}

问题是:如何检查 JWT 是否过期?令牌似乎没有过期。我必须添加什么代码才能检查令牌是否过期?

【问题讨论】:

  • 请分享您的ConsumerConfigurationCustomRequireClaim。关于如何检查jwt令牌是否过期,您可以使用以下代码:User.FindFirstValue("exp")

标签: c# asp.net-core jwt


【解决方案1】:

默认情况下,身份验证流程会为您处理此问题。甚至在您达到授权层之前就会发生这种情况。

【讨论】:

  • 我不知道,但现在还没有发生,如果令牌过期,它仍然会进行身份验证。有什么问题吗,我在代码中做什么? @Danial A. White
  • 请注意,如果令牌过期,您的授权处理程序仍然会被调用,但context.User 不会有任何声明,您能否确认您确实看到了声明?另外,您是否看到“exp”声明类型?如果是,价值是多少?
  • 默认情况下它会在 5 分钟内过期令牌,我必须在代码中添加这个 ClockSkew = TimeSpan.Zero
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2018-06-19
  • 2020-06-30
  • 2017-07-29
  • 2018-12-19
  • 2016-08-16
  • 2020-07-04
  • 2018-03-29
相关资源
最近更新 更多