私の構成には、Identity Server(Idp)、Windows認証ホスト、エンドユーザークライアントサイトの3つのサイトがあります。クライアントサイトで、[Authorize]
で装飾されたコントローラーをリクエストすると、Identity Serverが起動します。
ポート44305のWindowsホストは明らかに例外をスローしており、IDサーバーはステータス500を受信しています。WindowsホストサイトのURLに問題なくアクセスできます。 XMLドキュメントを取得します
この認証プロセスを停止している例外またはエラーをデバッグして見つけるにはどうすればよいですか?私は次のように最も内側の3つの部分の例外を受け取ります
InvalidOperationException: IDX10803: Unable to create to obtain configuration from: 'https://localhost:44305/'.
Microsoft.IdentityModel.Protocols.ConfigurationManager`1.<GetConfigurationAsync>d__3.MoveNext() in ConfigurationManager.cs
WindowsホストOWINスタートアップはUseWindowsAuthenticationServiceを使用しています
Identity Server OWINはAuthenticationOptions = WsFederationAuthenticationOptionsを使用しています
var wsFederationOptions = new WsFederationAuthenticationOptions
{
AuthenticationType = "windows",
Caption = "Windows",
SignInAsAuthenticationType = signInAsType,
MetadataAddress = "https://localhost:44305/",
Wtrealm = "urn:idsrv3"
};
app.UseWsFederationAuthentication(wsFederationOptions);
}
ここにリクエストとレスポンスがあります
Request URL:https://localhost:44315/
Request Method:GET
Status Code:302 Found
Response:Location:https://localhost:16433/connect/authorize?client_id=hms2015&redirect_uri=...
Request: https://localhost:16433/connect/authorize?client_id=hms2015&redirect_uri=...
Request Method:GET
Status Code:302 Found
Location:https://localhost:16433/login?signin=fde7508a6634698847c3076c9028604b
Request URL:https://localhost:16433/login?signin=fde7508a6634698847c3076c9028604b
Request Method:GET
Status Code:500 Internal Server Error
目に見えるSSLの問題はありません。ブラウザを使用すると、警告なしでさまざまなサイトのすべてのページを開くことができます。 localhost IIS Express certをTrusted Root Certに追加します。
チームの別の開発者が問題の発見を支援しました。ポート44305で実行されているWindows認証ホストでは、匿名が無効になっています。これを有効にすると、リダイレクトされたプロセスが再び機能し始めました。
残念ながら、実際にはエラーを検出できませんでしたが、試行錯誤(ハッキング)により修正されました。私の主な質問は、HTTP 500の詳細を実際に確認できるように、OWINアプリをどのようにデバッグするかということでした。 IdentityServer3ログがWin Authホストからの応答を記録できたらいいのにと思います。また、なぜそれは401応答コードではないのですか?
この問題が発生したため、 Robert Muehsig answer に従って証明書を信頼する必要がありました。
しかし、これだけでは十分ではありませんでした。 Bearer Token Authenticationを使用しています。さらに掘り下げてみると、DelayLoadMetadataフラグをtrueに設定する必要があることがわかりました。
したがって、私のWeb APIスタートアップでは:
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
DelayLoadMetadata=true
});
これと証明書信頼の変更後、機能し始めました。私はこれが元の問題と同じ設定ではないことを知っていますが、検索中にこの投稿に出くわし続けたので、それを偶然見つけた人のためにここに置くと思いました...
私の記憶から、このエラーは主に証明書の信頼/ネットワークアクセスの問題が原因でスローされます。ローカルホストですべてのコンポーネントを実行しているため、ネットワークの問題ではありません。 VS Dev環境から実行していると思います。
いくつかのこと:
また、ここで説明するように、証明書を読み取るためのアクセス許可を割り当てます https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Certificates
それでもこの問題が発生する場合は、Wireshark経由でトラフィックを監視してみてください(この場合、Fiddlerは動作しません)
テストのために、パイプラインの最初のミドルウェアとして以下のブロックを追加しました。これにより、例外が発生するたびに実際に例外がログに記録されます。これにより、私の500は実際には401であることがわかりました。
appBuilder.Use(async (context, next) =>
{
try
{
await next();
}
catch(Exception ex)
{
Log.Error(ex, "OWIN error.");
}
});
私のチームは次の問題に直面しました。[エラー] Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:メッセージの処理中に例外が発生しました。 System.InvalidOperationException:IDX10803: ' https:// [your identity server domain] /。well-known/openid-configuration'から構成を取得できません。 ---> System.IO.IOException:IDX10804: ' https:// [your identity server domain] .well-known/openid-configuration'からドキュメントを取得できません。 ---> System.Net.Http.HttpRequestException:接続されたパーティが一定期間後に適切に応答しなかったため、または接続されたホストが応答しなかったために確立された接続が失敗したため、接続試行が失敗しました---> System.Net.Sockets .SocketException:接続されたホストが一定期間後に適切に応答しなかったため、または接続されたホストがSystem.Net.Http.ConnectHelper.ConnectAsync(String Host、Int32 port、CancellationToken cancelToken)---内部例外スタックトレースの終了---
理由を見つけるのに多くの時間を費やしました。最後に、非常に単純な間違いです。UAT環境では、「C:\ Windows\System32\drivers\etc」のホストファイルのセットアップが正しくありませんでした。 hostsファイルで定義されたドメインは、IISでバインドされているドメインと一致しません。
プロキシ認証も原因である可能性があります。 login.microsoftonline.com:XXX呼び出しのフィドラートラフィックを確認し、407エラーコードが返されるかどうかを確認してください。
407エラーコードが表示される場合、web.configでプロキシ認証を有効にする必要があります