2016-07-21 12 views
1

私が製作したminimal verifiable sampleのASP.NET Core 1.0(rtm)を使用して、私が作ったJSON Webトークンが.NETのコアの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. 「署名する」作業を含むこのデモの作業を行う簡単なステップ(多分1行にすぎないコード)がありますか?

  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 
    ); 

それを修正し、それが動作するはずです。

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

あなたはあなたを揺する。私の謙虚な賞賛と称賛を受け入れてください。 –

関連する問題