C# 如何在Asp.net Core中手动验证JWT签名
我有一个没有任何控制器实现的Asp Net核心API。客户端(Auth0实现)正在传递一个JWT令牌(RS256 alg),我需要验证签名是否有效。我已经阅读了Auth0官方文档,其中建议实现JwtBearer并在启动配置中将应用程序设置为UseAuthentication Microsoft.AspNetCore.Authentication.JwtBearer 如上所述,这个API中没有控制器,我不能用Authorize attrubute修饰这个方法,所以我可以选择手动验证这个签名。出于这个原因,我曾经浏览过一些堆栈溢出的帖子,其中人们提到了不同的方法,比如使用 System.IdentityModel.Tokens.Jwt 虽然其他人反对它,并建议使用低级别的实现等,我已经尝试了夫妇,但迄今为止没有成功 假设下面的方法是接收JWT令牌的API的入口点。请有人告诉我需要做什么才能手动验证签名C# 如何在Asp.net Core中手动验证JWT签名,c#,asp.net-core,jwt,C#,Asp.net Core,Jwt,我有一个没有任何控制器实现的Asp Net核心API。客户端(Auth0实现)正在传递一个JWT令牌(RS256 alg),我需要验证签名是否有效。我已经阅读了Auth0官方文档,其中建议实现JwtBearer并在启动配置中将应用程序设置为UseAuthentication Microsoft.AspNetCore.Authentication.JwtBearer 如上所述,这个API中没有控制器,我不能用Authorize attrubute修饰这个方法,所以我可以选择手动验证这个签名。出于这
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解码的结果
您可以这样做:
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
}
它基于,这解释了如何验证通过cookie接收的jwt令牌。虽然目标与您的不同,但验证令牌的方法可以应用于您的问题。您是否可以尝试更改
services.AddMvc()
toservices.AddMvc(options=>{var policy=new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();options.Filters.Add(new authorizationfilter(policy));})代码>因为这将删除对授权的要求attribute@p3tch,我看不出有什么区别。不管是否有令牌,InvokeAsync方法仍然会获得命中并为请求提供服务。顺便问一下,你建议的代码,是不是要验证策略(声明/角色等),而我只是想验证签名是否有效?是的,你是对的-即使你这样做,你的中间件仍然会在身份验证中间件之前被击中-我的错误这一个看起来很有希望(虽然我仍然认为应该可以使用“正常的”中间件)
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
}