gpt4 book ai didi

c# - UseJwtBearerAuthentication 失败,IDX10504 : Unable to validate signature, token 没有签名

转载 作者:太空宇宙 更新时间:2023-11-03 23:12:40 26 4
gpt4 key购买 nike

使用 ASP.NET Core 1.0 (rtm),有点 minimal verifiable sample我已经生成,我看到我生成的 JSON Web token 没有通过 .net core json web token 中间件声明挑战,并且失败并出现此错误:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: 
IDX10504: Unable to validate signature, token does not have a signature:
'... ... token value here...'

我制作了一个最小示例,它在 ASP.NET Core RC1 中运行良好,但在 RTM 中不起作用。我没有移植到 RC2 来测试,但我相信这样的测试是没有意义的。您可以使用提供的测试脚本来练习演示:

 python tests\testloginapi.py
GET OK: 200 http://localhost:54993/authorize/login?username=TEST&pas...
POST OK: 200 http://localhost:54993/authorize/login?username=TEST&pas...
authorization token received... eyJhbGciOi...
expected status 200 but got 401 for GET http://localhost:54993/authorizetest/test

我的最小示例的要点是:

Startup.cs 方法 Configure 有:

        app.UseJwtBearerAuthentication(_keyArtifacts.getJwtBearerOptions());

承载选项是这样的:

  public static JwtBearerOptions CreateJwtBearerOption(RsaSecurityKey key, string tokenIssuer, string tokenAudience)
{
var jwtBearerOptions = new JwtBearerOptions();


jwtBearerOptions.AutomaticAuthenticate = true;
jwtBearerOptions.AutomaticChallenge = true;
jwtBearerOptions.TokenValidationParameters.ValidateIssuerSigningKey = true;
jwtBearerOptions.TokenValidationParameters.IssuerSigningKey = key;
jwtBearerOptions.TokenValidationParameters.ValidIssuer = tokenIssuer;
jwtBearerOptions.TokenValidationParameters.ValidateIssuer = true;
jwtBearerOptions.TokenValidationParameters.ValidateLifetime = true;
jwtBearerOptions.TokenValidationParameters.ClockSkew = TimeSpan.Zero;



jwtBearerOptions.TokenValidationParameters.ValidAudience = tokenAudience;
return jwtBearerOptions;
}

这个问题归结为:

  1. 在 Asp.net core 1.0 rtm 中,创建将通过中间件挑战的 token 的最少步骤是什么?

  2. 我是否只是遗漏了一些简单的步骤(可能少到一行代码)来使这个演示正常工作,包括“签名”工作?

  3. 鉴于 demo仍然是一段可怕的代码,没有人应该在生产中使用它(因为我已经为此感到羞耻),我希望这个问题仍然可以说明如何制作 UseJwtBearerAuthentication系统确实有效,至少在演示规模上是这样。

最佳答案

In Asp.net core 1.0 rtm, what are the minimal steps to create a token that will pass the middleware challenge?Am I simply missing some simple step (as little as one line of code perhaps) that would make this demo work, including having "signing" work?

IdentityModel(负责验证 JWT 不记名中间件收到的 token 的库)无法验证您的 JWT token ,因为它们实际上没有任何签名,如您看到的错误中所述。

缺少签名可能是因为您在创建自己的 token 时没有分配 SecurityTokenDescriptor.SigningCredentials:

JwtSecurityTokenHandler handler = BearerOptions
.SecurityTokenValidators
.OfType<JwtSecurityTokenHandler>()
.First();

var tokenData = new SecurityTokenDescriptor
{

Issuer = BearerOptions.TokenValidationParameters.ValidIssuer,
Audience = BearerOptions.TokenValidationParameters.ValidAudience,
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
NotBefore = DateTime.Now
};

/*JwtSecurityToken*/
var securityToken =
handler.CreateToken
(
tokenData
);

修复它,它应该可以工作。

Given that the demo is still a horrible piece of code, and nobody should ever use it in production (because I'm already ashamed of it), my hope is this question can still be illuminating as to how to make the UseJwtBearerAuthentication system actually work, at least at a demo scale.

其实问题不在于你如何使用JWT承载中间件,而在于你如何生成你自己的token。实现你自己的 token 发行者酱汁很好,但使用像 OAuth 2.0 或 OpenID Connect 这样的标准通常更好,更容易使用(例如,当有 OIDC 服务器时,你不必配置 JWT 承载中间件,因为它会直接下载使用 OIDC discovery 的签名 key )。

请随意阅读其他 SO answer获取更多信息。

关于c# - UseJwtBearerAuthentication 失败,IDX10504 : Unable to validate signature, token 没有签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com