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

时间:2018-12-21 09:46:57

标签: c# asp.net-core jwt

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

  

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

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

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();
    ClaimsPrincipal principal;

    try
    {
        principal = handler.ValidateToken(accessToken, validationParameters, out SecurityToken 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令牌。尽管目标与您的目标不同,但是可以使用验证令牌的方法来解决您的问题。