2016-07-21 5 views
1

제가 제작 한 minimal verifiable sample과 함께 ASP.NET Core 1.0 (rtm)을 사용하면 제가 제작 한 JSON Web Token이 그물 코어 JSON 웹 토큰 미들웨어 주장 도전을 전달하고이 오류와 함께 실패 : 나는 ASP.NET 코어 RC1에서 잘 작동 최소한의 샘플을 생산UseJwtBearerAuthentication이 IDX10504와 함께 실패했습니다. 서명을 확인할 수 없습니다. 토큰에 서명이 없습니다.

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

하지만 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 
    ); 

수정이, 그리고 그것을 작동합니다. 당신이 JWT 베어러 미들웨어를 사용하지만 당신이 당신의 자신의 토큰을 생성하는 방법을 어떻게

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.

사실 문제가되지 않습니다. 자신의 토큰 발급자 소스 구현은 괜찮지 만 OAuth2 또는 OpenID Connect 같은 표준을 사용하는 것이 일반적으로 더 쉽고 편리합니다 (예 : OIDC 서버를 사용할 경우 JWT 베어러 미들웨어를 직접 구성 할 필요가 없습니다. OIDC discovery을 사용하여 서명 키).

자세한 내용은 SO answer을 읽어보십시오.

+0

이미 SigningCredentials 객체가 있다고 생각합니다.어쩌면 나는 아주 가깝다. –

+0

'SigningCredentials'를 생성자 매개 변수로 이미 주입했습니다. 단순히 그것을 흘려 보지 않으시겠습니까? – Pinpoint

+0

당신은 선생님입니다. 제 겸손한 칭찬과 경배를 받아주세요. –