【问题标题】:How to verify JWT signature manually in Asp.net Core如何在 Asp.net Core 中手动验证 JWT 签名
【发布时间】:2019-05-21 18:57:05
【问题描述】:

我有一个没有任何控制器实现的 Asp Net Core API。客户端(Auth0 实现)正在传递一个 JWT 令牌(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 中没有控制器,我无法使用 Authorize 属性装饰方法,因此我可以选择手动验证此签名。出于这个原因,我一直在通过堆栈溢出帖子,人们提到了不同的方法,例如使用

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解码结果

【问题讨论】:

  • 您可以尝试将services.AddMvc(); 更改为services.AddMvc(options => { var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); options.Filters.Add(new AuthorizeFilter(policy)); });,因为这将消除对授权属性的要求
  • @p3tch,我认为它没有任何区别。不管是否有令牌, InvokeAsync 方法仍然会获得命中并为请求提供服务。顺便说一句,您建议的代码是不是要验证策略(声明/角色等),而我只想验证签名是否有效?
  • 是的,你是对的 - 即使你这样做,你的中间件仍然会在 auth 中间件之前被命中 - 我的错误
  • 这个看起来很有前途jerriepelser.com/blog/manually-validating-rs256-jwt-dotnet(虽然我仍然认为应该可以使用“普通”中间件)

标签: c# asp.net-core jwt


【解决方案1】:

你可以这样做:

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 令牌。尽管目标与您的不同,但验证令牌的方式可以应用于您的问题。

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 2021-12-12
    • 2018-10-11
    • 2019-11-03
    • 2018-06-23
    • 2014-05-29
    • 2018-12-13
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多