Аутентификация ASP.NET Core с JWT: «Подпись недействительна» - PullRequest
0 голосов
/ 16 июня 2019

Я хочу включить аутентификацию на основе утверждений jwt.По какой-то причине токен кажется недействительным, более конкретно, его подпись, похоже, является проблемой.

Я попытался проверить подпись на https://jwt.io/, и она успешно подтверждена.

1006 * Мой лексема

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZ2VudCIsImF1dCI6WyJST0xFX0FHRU5UIl0sImlzcyI6Ik1ULVVzZXIiLCJpYXQiOjE1NjA2OTcyMDIsImV4cCI6MTU2MDY5ODEwMn0.WDTPFuEsRRuDfko2dR_5QsWWmyEwUtup-C-V3AF0tE95SJWuNtTiWQCcGoHsNdi-Y7G62pNv4TpaQ3h-deGR3A

И секрет

1014 *

9ST5hQe5dUNfAJOQZAtt19uiDhNtKKUt

Мой класс Startup.cs:

public void ConfigureServices(IServiceCollection services) 
{

            /*...*/

            var key = Encoding.ASCII.GetBytes("9ST5hQe5dUNfAJOQZAtt19uiDhNtKKUt");
            var signingKey = new SymmetricSecurityKey(key);

            // Authenticate a request 
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = signingKey,
                    ValidateAudience = false,
                    ValidateIssuer = false
                };
            });
            // Custom policy to check if a certain claim has a certain value
            services.AddAuthorization(options =>
            {
                options.AddPolicy(
                    "IsAgentPolicy",
                    policy => policy.RequireClaim("aut", "ROLE_AGENT")
                );
            });

            /*...*/
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();

            app.UseMvc();
        }

Мой тестовый API-контроллер ValuesController.cs:

    [Route("api/[controller]")]
    public class ValuesController : ControllerBase
    {
        // GET: api/<controller>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<controller>/5
        [HttpGet("{id}")]
        [Authorize("IsAgentPolicy")]
        public string Get(int id)
        {
            return "value";
        }
    }

Я пытался нажатьКонечная точка 'localhost: 5000 / api / values ​​/ 1' (которая имеет атрибут авторизации), добавляя «Носитель» в заголовок «Авторизация», однако я получаю заголовок ответа

WWW-Authenticate→ Ошибка носителя = "invalid_token", error_description = "Подпись недействительна"


1 Ответ

0 голосов
/ 17 июня 2019

Решено

Похоже, что секрет был закодирован Base64URL и нуждался в расшифровке, прежде чем его можно было использовать при формировании ключа подписи

var key = Base64UrlEncoder.DecodeBytes("YOUR_SECRET");
SymmetricSecurityKey signingKey = new SymmetricSecurityKey(key);
...