Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Asp.net Core中手动验证JWT签名_C#_Asp.net Core_Jwt - Fatal编程技术网

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

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修饰这个方法,所以我可以选择手动验证这个签名。出于这

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

Microsoft.AspNetCore.Authentication.JwtBearer

如上所述,这个API中没有控制器,我不能用Authorize attrubute修饰这个方法,所以我可以选择手动验证这个签名。出于这个原因,我曾经浏览过一些堆栈溢出的帖子,其中人们提到了不同的方法,比如使用

System.IdentityModel.Tokens.Jwt

虽然其他人反对它,并建议使用低级别的实现等,我已经尝试了夫妇,但迄今为止没有成功

假设下面的方法是接收JWT令牌的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解码的结果


您可以这样做:

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()
to
services.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
}