3

私はIS4 Identityサンプルに基づくIdentityServer4アプリケーションと、IS4.AccessTokenValidationによる認可のためのベアラトークンを使用するAPIを持っています。これは、VisualStudioを介してlocalhost上で正常に動作しているとき、私はWindows 2012 VMに展開し、IIS経由でホストしています。アイデンティティサーバーをAzureにApp Service Webサイトとしてデプロイすると、すべてが問題ありません。しかし、APIとVMと同じドメインと証明書を使用してアプリケーションサービスとしてデプロイする場合、Authorize属性を持つメソッド(ポリシーを使用するかどうかは関係ありません)は、常に401というヘッダーメッセージを返します。IdentityServer4 AuthorizeはAzure AppServiceで「署名鍵が見つかりませんでした」を取得します

Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found" 

最新バージョンのIdentityServer4とIdentityServer4.AccessTokenValidationパッケージを使用して、.NET 4.5.2を使用しています。また、GitHubから最新のこれらのパッケージを30/08/16から引き継いだ。とにかくIS4 Validatorがバグだとは思わないが、私は何を知りません。が原因です。助言がありますか? Azureのホストバグですか?

私はこれをデバッグできるのが大好きですが、私はゼロから再構築しても、このアプリケーションにリモートデバッグを働かせることはできません。私はASP.NET Securityのリポジトリに迷っていましたが、より多くのログやデバッグアクセスがなければ、私はこの問題をどのように解決するかわかりません。

var jwtBearerOptions = new JwtBearerOptions() 
     { 
      Authority = Configuration["Authentication:IdentityServer:Server"], 
      Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources", 
      RequireHttpsMetadata = false, 

      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
     }; 
     app.UseJwtBearerAuthentication(jwtBearerOptions); 

とIdentity Serverが一直線状の試料の外で、署名のために購入証明書を使用して:

APIの設定は非常に基本的です。

他の誰もがAzure App Servicesとして完全に動作するこの構成を持っていますか?または、VMホストAPIに送信された同じベアラトークンを使用すると、このエラーが発生する可能性があります。

+0

idsrv3と同様のケースがhttps://gitter.im/IdentityServer/IdentityServer3/archives/2015/04/13で議論されました。私が理解していることは、アイデンティティ・サーバー・メタデータ( '.well-known/opened-configuration')を取得できないことから発生する問題です。さらにロギングするには、 'api'のaspnetコアロギングを設定します(serilogを使ってテキストファイルにログを書き込むことができます)。エラーログを調べます。 –

+0

そのスレッドでトークンのサイズについて興味深い可能性があります。私のものはかなり大きいですが、私はそれがすべてのホストで問題になると思っています。それと遊びを持つだろう。あなたはロギングについて正しいです、私はSerilogを追加します。出てくるものを見てください。 – user1587195

+0

私が本当に必要としていたより多くのログを取得し、セキュリティレポコードを調べました。何らかの理由でApp ServiceのSigningKey検証オプションに違いがなければならないようです。 – user1587195

答えて

3

IssuerSigningKeyを明示的にTokenValidationParametersに設定する必要があることが判明しました。だから私は、App Serviceストアから証明書を取得し、JwtBearerOptions.TokenValidationParameters経由で追加します。したがって、スタートアップの設定は次のようになります。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     ... 
     JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>(); 
     var tokenValidationParameters = new TokenValidationParameters 
     { 
      // The signing key must match! 
      ValidateIssuerSigningKey = true, 
      IssuerSigningKey = new X509SecurityKey(GetSigningCertificate()), 

      // Validate the JWT Issuer (iss) claim 
      ValidateIssuer = false, 
      //ValidIssuer = "local", 

      // Validate the JWT Audience (aud) claim 
      ValidateAudience = false, 
      //ValidAudience = "ExampleAudience", 

      // Validate the token expiry 
      ValidateLifetime = true, 

      // If you want to allow a certain amount of clock drift, set that here: 
      ClockSkew = TimeSpan.Zero 
     }; 
     var jwtBearerOptions = new JwtBearerOptions() 
     { 
      Authority = Configuration["Authentication:IdentityServer:Server"], 
      Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources", 
      RequireHttpsMetadata = false, 

      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 

      TokenValidationParameters = tokenValidationParameters 
     }; 
     app.UseJwtBearerAuthentication(jwtBearerOptions); 

     app.UseMvc(); 
     ... 
    } 

なぜこれがAzure Appサービスでのみ必要であり、サーバーまたは開発マシンでは必要でないのか分かりません。他の誰かがそれを説明できますか? App ServiceではValidateIssuerSigningKeyのデフォルト値がtrueになり、それ以外の場合はfalseになります。

関連する問題