3

JWTベアラトークンを発行して認証するようにASP.Netコアアプリケーションを設定しました。クライアントは、サイトがKestrelでホストされている場合、ベアラトークンを正常に取得してトークンで認証できます。OpenId Connectと連携するためにASP.Net TestHostをどのように設定しますか?

また、Microsoft.AspNetCore.TestHost.TestServerを使用する一連の統合テストもあります。認証を追加する前に、テストはアプリケーションに対して正常に要求を行うことができました。認証を追加した後、オープンID設定へのアクセスに関連してエラーが発生しました。私が見ている特定の例外はこれです:私の研究に基づいて

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 
     Request starting HTTP/1.1 GET http:// 
fail: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[3] 
     Exception occurred while processing message. 
System.InvalidOperationException: IDX10803: Unable to obtain configuration from: 'http://localhost/.well-known/openid-configuration'. ---> System.IO.IOException: IDX10804: Unable to retrieve document from: 'http://localhost/.well-known/openid-configuration'. ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 404 (Not Found). 

、これは当局がホストするサーバーとは別のホストに設定されているときに時々トリガーです。たとえば、Kestrelはデフォルトでhttp://localhost:5000で実行されますが、これは私の当局が最初に設定したものですが、TestServerがエミュレートしているものに設定すると(http://localhost)、それでも同じエラーが発生します。ここに私の認証設定は次のとおりです。

app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true, 
     RequireHttpsMetadata = false, 
     TokenValidationParameters = new TokenValidationParameters 
     { 
      ValidateIssuerSigningKey = true, 
      IssuerSigningKey = signingKey, 
      ValidateAudience = true 
     }, 
     Audience = "Anything", 
     Authority = "http://localhost" 
    }); 

奇数は何統合テストから直接URLをヒットしようとすると、正常に動作することをされています

enter image description here

それでは、どのようにASP.Net TESTSERVERを設定しますOpenId Connectインフラストラクチャは連携して動作しますか?この上でビットを反映して

=== EDIT ====

が、問題はJWT認可内部がhttp://localhostポート80への要求をしようとしていることであることを私に起こったが、それはにISN TestServerを使用してリクエストを作成しようとしているため、実際のサーバーを探しています。 1つではないので、決して認証するつもりはありません。次のステップは、権限チェックを無効にする方法や、TestServerをホストとして使用できるようにインフラストラクチャーを何らかの方法で拡張する方法があるかどうかを確認することです。

+0

あなたの編集は正しいです。権限を設定していない設定をテストで提供しようとしましたか?技術的には、JWT認証をまったく使用しなくても、すべてのテストに必要なのは、認証されたユーザー(即興/模擬できる)です。 – Brad

+0

私は当局を設定しようとしなかったと信じていますが、私はそれがエラーを投げかけていることを思い起こさせるようです。私は解決策を見つけることに終わり、答えを掲示します。 –

答えて

0

JWTインフラストラクチャは、実際にはデフォルトでHTTPリクエストを作成しようとします。私はそれがDIが提供するIDocumentResolver供給OpenIdConnectionConfigurationRetriever()の新しいインスタンスにJwtBearerOptions.ConfigurationManagerプロパティを設定することにより動作させることができました:

 ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
      authority + "/.well-known/openid-configuration", 
      new OpenIdConnectConfigurationRetriever(), 
      _documentRetriever), 

生産コードでは、私はちょうど私のコンテナでデフォルトを登録します(Autofac):

builder.RegisterType<HttpDocumentRetriever>().As<IDocumentRetriever>(); 

Iはすでにコンテナを設定するテンプレートメソッドパターンを次の私の統合テストのための派生セットアップクラスを使用していたので、私はから結果を返すものとIDocumentRetrieverインスタンスを上書きすることができましたTestServerインスタンス。

私は、リクエストが行われたときにTestServerのクライアントがハングアップしたように見える(JWTが私のIDocumentRetrieverを呼び出して起動したとき)、もう1つのリクエストが既に未処理だった(リクエストを開始した私はIDocumentRetrieverからキャッシュされた結果を提供しなければなりませんでした。

public class TestServerDocumentRetriever : IDocumentRetriever 
{ 
    readonly IOpenIdConfigurationAccessor _openIdConfigurationAccessor; 

    public TestServerDocumentRetriever(IOpenIdConfigurationAccessor openIdConfigurationAccessor) 
    { 
     _openIdConfigurationAccessor = openIdConfigurationAccessor; 
    } 

    public Task<string> GetDocumentAsync(string address, CancellationToken cancel) 
    { 
     return Task.FromResult(_openIdConfigurationAccessor.GetOpenIdConfiguration()); 
    } 
} 
+1

こんにちは@DerekあなたはIdentityServer4を使用していて、統合テストをしようとしている他の人にこのスレッドをハイジャックしてもらえたらいいと思います。私はこのスレッドの解決策を見つけたhttp://stackoverflow.com/questions/39390339/integration-testing-with-in-memory-identityserver – JimiSweden

関連する問題