【问题标题】:AspNetCore JWT Authentication Without "iat" in token header令牌标头中没有“iat”的 AspNetCore JWT 身份验证
【发布时间】:2020-08-27 19:11:43
【问题描述】:

我正在尝试在某些应用程序中配置身份验证,该应用程序将使用来自另一个系统的登录验证。基本上,我得到一个带有用户信息的令牌,我必须将它映射到我的数据库,因为它已经通过了用户身份验证。我们正在使用 jwt 令牌来做到这一点。

那么问题来了:

我得到的令牌没有“iat”字段,AspNetCore 似乎拒绝没有该字段的令牌。

有没有办法配置身份验证以忽略该字段?

这是令牌结构:

令牌 - 标题

{
  "alg": "HS512"
}

代币 - 正文

{
  "sub": [mysub],
  "user": { ... },
  "exp": [timestamp]
}

这是配置:

...
services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateIssuerSigningKey = false,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
...

【问题讨论】:

    标签: c# asp.net-core authentication jwt


    【解决方案1】:

    编辑:此答案的早期版本混淆了iatnbf。答案已相应改写。


    我尝试在一个空项目中重现您的问题,并且成功地验证了具有您在问题中概述的结构的令牌(因此没有iat 声明)。

    我用来让它工作的设置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(o =>
                {
                    o.TokenValidationParameters = new TokenValidationParameters
                        {
                            ValidateIssuerSigningKey = false,
                            ValidateIssuer = false,
                            ValidateAudience = false,
                            SignatureValidator = (t, p) => new JwtSecurityToken(t)
                        };
                });
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();
    
        app.UseAuthentication();
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
    }
    
    [Authorize]
    [Route("debug")]
    public class DebugAuthController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get() => Ok(User.Claims.Single(c => c.Type == "user").Value);
    }
    

    我使用以下令牌进行测试:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJteXN1YmplY3QiLCJ1c2VyIjp7Im5hbWUiOiJTdGFja092ZXJmbG93In0sImV4cCI6MTU5MDk5NzMyNn0.FVFl6gDYOrmzj7_6OqHPTxU3mfQWs864u7fBLM5ThuM

    值得仔细检查一下您是否在ConfigureServices 中同时调用了UseAuthenticationUseAuthorization,并且您是按此顺序调用它们的。


    注意:提供的示例代码几乎禁用了 JWT 上的所有验证检查以进行测试。除非您知道自己在做什么,否则不要按原样使用此代码!

    【讨论】:

    • 我尝试调试此函数,但没有iat 字段,代码甚至无法进入该函数
    • 我在原始答案中混淆了iatnbf。更新了对我有用的设置的最小复制。
    • 这个错误在别处,但我会在这里分享。事实证明,保存用于加密我的令牌的秘密的数据库被定义为具有maxlenght = 100,而我的秘密大约有 120 个字符。所以数据库正在截断我的秘密。然而,有时令牌已经过验证,但我从未收到 Invalid secret 或类似的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2012-12-12
    • 2020-07-07
    • 2021-12-17
    • 2019-08-19
    • 2020-03-31
    相关资源
    最近更新 更多