簡體   English   中英

如何在Asp.net Core中手動驗證JWT簽名

[英]How to verify JWT signature manually in Asp.net Core

我有一個沒有任何控制器實現的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解碼結果

在此輸入圖像描述

你可以這樣做:

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令牌。 雖然目標與您的不同,但驗證令牌的方式可以應用於您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM