2016-07-21 1 views
1

Используя ASP.NET Core 1.0 (rtm), с некоторым количеством minimal verifiable sample, которое я создал, я вижу, что ящики JSON Web Tokens I, минуя ядро ​​.net JSON веб-маркер промежуточного претензии вызов, и терпят неудачу с этой ошибкой:Использование ошибки JwtBearerAuthentication с IDX10504: Не удалось проверить подпись, токен не имеет подписи

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: 
IDX10504: Unable to validate signature, token does not have a signature: 
'... ... token value here...' 

Я произвел минимальный образец, который работал хорошо в ASP.NET ядра RC1, но не работает в RTM , Я не поступил на RC2 для тестирования, но я считаю, что такой тест бессмыслен. Вы можете воспользоваться демо с предоставленного сценария тестирования:

python tests\testloginapi.py 
    GET OK: 200 http://localhost:54993/authorize/login?username=TEST&pas... 
    POST OK: 200 http://localhost:54993/authorize/login?username=TEST&pas... 
    authorization token received... eyJhbGciOi... 
    expected status 200 but got 401 for GET http://localhost:54993/authorizetest/test 

Заметные точки моего минимального примера:

метод Startup.cs Настройка имеет:

 app.UseJwtBearerAuthentication(_keyArtifacts.getJwtBearerOptions()); 

Варианты на предъявителя, как это :

public static JwtBearerOptions CreateJwtBearerOption(RsaSecurityKey key, string tokenIssuer, string tokenAudience) 
     { 
      var jwtBearerOptions = new JwtBearerOptions(); 


      jwtBearerOptions.AutomaticAuthenticate = true; 
      jwtBearerOptions.AutomaticChallenge = true; 
      jwtBearerOptions.TokenValidationParameters.ValidateIssuerSigningKey = true; 
      jwtBearerOptions.TokenValidationParameters.IssuerSigningKey = key; 
      jwtBearerOptions.TokenValidationParameters.ValidIssuer = tokenIssuer; 
      jwtBearerOptions.TokenValidationParameters.ValidateIssuer = true; 
      jwtBearerOptions.TokenValidationParameters.ValidateLifetime = true; 
      jwtBearerOptions.TokenValidationParameters.ClockSkew = TimeSpan.Zero; 



      jwtBearerOptions.TokenValidationParameters.ValidAudience = tokenAudience; 
      return jwtBearerOptions; 
     } 

Этот вопрос действительно сводится к:

  1. В Asp.net core 1.0 rtm, каковы минимальные шаги для создания токена, который пройдет мимо промежуточного вызова?

  2. Я просто пропустил какой-то простой шаг (возможно, хотя бы одну строку кода), что сделало бы эту демонстрационную работу, в том числе «подписью» работы?

  3. Учитывая, что demo по-прежнему является ужасным фрагментом кода, и никто не должен его использовать в производстве (потому что я уже стыжусь этого), я надеюсь, что этот вопрос все еще может быть освещен относительно того, как сделать система UseJwtBearerAuthentication действительно работает, по крайней мере, в демонстрационной шкале.

+0

Полезная информация: https://stormpath.com/blog/token-authentication-asp-net-core –

ответ

3

In Asp.net core 1.0 rtm, what are the minimal steps to create a token that will pass the middleware challenge? Am I simply missing some simple step (as little as one line of code perhaps) that would make this demo work, including having "signing" work?

IdentityModel (библиотека ответственным проверки маркеров, полученных с помощью однонаправленного промежуточного JWT) не может проверить свои маркеры JWT, потому что они фактически не имеют подписи, как объяснено в сообщении об ошибке вас» повторно посмотрев.

Отсутствие подписи, вероятно, вызвано тем, что вы не присваивающей SecurityTokenDescriptor.SigningCredentials при создании собственных лексем:

JwtSecurityTokenHandler handler = BearerOptions 
    .SecurityTokenValidators 
    .OfType<JwtSecurityTokenHandler>() 
    .First(); 

var tokenData = new SecurityTokenDescriptor 
{ 

    Issuer = BearerOptions.TokenValidationParameters.ValidIssuer, 
    Audience = BearerOptions.TokenValidationParameters.ValidAudience, 
    Subject = new ClaimsIdentity(claims), 
    Expires = DateTime.Now.AddDays(1), 
    NotBefore = DateTime.Now 
}; 

/*JwtSecurityToken*/ 
var securityToken = 
    handler.CreateToken 
    (
     tokenData 
    ); 

Fix, что, и он должен работать.

Given that the demo is still a horrible piece of code, and nobody should ever use it in production (because I'm already ashamed of it), my hope is this question can still be illuminating as to how to make the UseJwtBearerAuthentication system actually work, at least at a demo scale.

На самом деле, проблема заключается не в том, как вы используете однонаправленные промежуточное программное обеспечение JWT, но, как вы создаете свои собственные маркера. Внедрение собственного сокета-эмитентов-маркеров отлично, но использование стандартного типа OAuth2 или OpenID Connect обычно лучше и проще в использовании (например, при наличии OIDC-сервера вам не нужно настраивать промежуточное ПО-носитель JWT, поскольку оно будет напрямую загружать подписи с использованием OIDC discovery).

Не стесняйтесь читать эту другую SO answer для получения дополнительной информации.

+0

Я думаю, что у меня уже есть объект SigningCredentials.Так что, может быть, я очень близко. –

+0

Вы уже вводите 'SigningCredentials' в качестве параметра конструктора, почему бы просто не протекать? – Pinpoint

+0

Вы рок сэр. Примите мою скромную похвалу и обожание. –

Смежные вопросы