gpt4 book ai didi

c# - 如何在 Asp.net Core 中手动验证 JWT 签名

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:29 24 4
gpt4 key购买 nike

我有一个没有任何 Controller 实现的 Asp Net Core API。客户端(Auth0 实现)正在传递我需要验证签名是否有效的 JWT token (RS256 alg)。我已经阅读了建议实现 JwtBearer 并在启动配置中将应用程序设置为 UseAuthentication 的 Auth0 官方文档

Microsoft.AspNetCore.Authentication.JwtBearer

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

// 1. Add Authentication Services
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

}).AddJwtBearer(options =>
{
options.Authority = "https://myapi.auth0.com/";
options.Audience = "API/Endpoint";
});
}

如上所述,此 API 中没有 Controller ,我无法使用 Authorize 属性修饰该方法,因此我只能选择手动验证此签名。出于这个原因,我一直在浏览堆栈溢出帖子,其中人们提到了不同的方法,例如使用

System.IdentityModel.Tokens.Jwt

虽然其他人反对它并建议使用低级实现等。我已经尝试了几次但到目前为止没有成功。

假设以下方法是接收 JWT token 的 API 的入口点。请有人告诉我我需要做什么才能手动验证签名

    public Task InvokeAsync(HttpContext context)
{
var accessToken = context.Request.Headers["Authorization"];
// Here I wan't to verify the signature?
// This token has RS256 alg
}

JWT解码结果如下

enter image description here

最佳答案

你可以这样做:

public Task InvokeAsync(HttpContext context)
{
var accessToken = context.Request.Headers["Authorization"];
var secretKey = "Insert your secret key here";

var validationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true;
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
// Add any other validations: issuer, audience, lifetime, etc
}

var handler = new JwtSecurityTokenHandler();

var principal = handler.ValidateToken(accessToken, validationParameters, out var validToken);
JwtSecurityToken validJwt = validToken as JwtSecurityToken;

if (validJwt == null)
{
throw new ArgumentException("Invalid JWT");
}

if (!validJwt.Header.Alg.Equals(SecurityAlgorithms.RsaSha256Signature, StringComparison.Ordinal))
{
throw new ArgumentException("Algorithm must be RS256");
}

// Add any validations which cannot be included into TokenValidationParameters

// Validation passed, continue with your logic
}

它基于this article ,其中解释了如何验证通过 cookie 接收到的 jwt token 。尽管目标与您的不同,但验证 token 的方式可以应用于您的问题。

关于c# - 如何在 Asp.net Core 中手动验证 JWT 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882474/

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