отдельно созданный JWT не авторизуется в ядре asp. net - PullRequest
0 голосов
/ 05 мая 2020

У меня есть сценарий, в котором мне нужно создать JWT в приложении javascript вручную, поэтому я использовал здесь код

https://codepen.io/jpetitcolas/pen/zxGxKN

и в моем asp. net core У меня есть простой контроллер значений с функцией, украшенной Authorize

[Authorize]
    [Route("GetValues")]
    [HttpGet]
    public IEnumerable<string> GetValues()
    {
        return new string[] { "value1", "value2" };
    }

, а в моем startup.cs у меня есть

       public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = false;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("My very confidential secret!!!")),
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime = false, //set this to true when a reasonable lifetime has been determined based on jwt generation
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
        services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

, как вы можете видеть i Я использую тот же секрет в токене и пытаюсь проверить его в ядре asp. net, но когда я использую почтовый человек для вызова https://localhost: 44364 / GetValues ​​ с ключом авторизации, установленным на "Bearer" i получить 401-UnAuthorized. Я что-то упускаю ?

любая идея, что я здесь делаю не так.

ОБНОВЛЕНИЕ

 public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {            
        // services.AddAuthorization();
        services.AddControllers();

        // var hmac = new HMACSHA256(System.Text.Encoding.ASCII.GetBytes("My very confidential secret!!!"));
        // var symKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(hmac.Key);

        var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("My very confidential secret!!!"));
                var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256Signature);

        services.AddAuthentication(opt =>
        {
            opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.RequireHttpsMetadata = false;
            options.SaveToken = true;
            options.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = false,
                ValidateIssuerSigningKey = true,
                ClockSkew = System.TimeSpan.Zero,
                IssuerSigningKey = signinCredentials.Key
            };
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // app.UseMiddleware<AuthenticationMiddleware>();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // ...
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthentication(); // this one first
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Обновление 2

, даже если я установил ValidateIssuerSigningKey = false означает, что я даже не хочу проверять ключ даже тогда я получаю 401 Неавторизованный. , чтобы воссоздать , мы можем просто создать пробел. net основной проект api с контроллером образцов значений и скопировать и вставить мой Startup.cs, а затем токен-носитель из https://codepen.io/jpetitcolas/pen/zxGxKN, который eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTMzNywidXNlcm5hbWUiOiJqb2huLmRvZSJ9.EvTdO JS -fbffGHLyND3BMDwWE22zUBOCRspPZEHlNEw

1038 * и ласты просто использовать почтальоном как этот 1040 *enter image description here

1 Ответ

0 голосов
/ 05 мая 2020

Вы не используете тот же ключ подписи, в вашей js скрипке у вас есть строка в качестве ключа, и в вашей проверке вы ожидаете симметричный c ключ.

В js у вас есть строка ниже, где секрет - это ваш ключ подписи:

подпись = Crypto JS .HmacSHA256 (подпись, секрет);

Использование секрета в качестве ключа подписи должно решить проблему.

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