Как проверить подпись JWT вручную в Asp.net Core - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть 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

, в то время как другиев противоположность этому и предложил использовать низкоуровневую реализацию и т. д. Я пробовал пару, но пока безуспешно.

Допустим, следующий метод является точкой входа API, который получает токен JWT.Пожалуйста, кто-нибудь подскажет, что мне нужно сделать, чтобы проверить подпись вручную

    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 голосов
/ 22 декабря 2018

Вы можете сделать что-то вроде этого:

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
}

Он основан на этой статье , в которой объясняется, как проверять токены jwt, полученные с помощью файлов cookie.Хотя цель отличается от вашей, к вашей проблеме можно применить способ проверки токенов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...