ビルドしているウェブアプリで問題が発生しています。 Webアプリケーションは、角度4のフロントエンドとドットネットコアのRESTfulなapiバックエンドで構成されています。要件の1つは、SSL相互認証を使用してバックエンドへの要求を認証する必要があることです。すなわち、クライアント証明書。TLSクライアント証明書が、ほとんどのブラウザでプリフライトリクエストに含まれないのはなぜですか?
現在、私は、Azureのアプリサービスとしてフロントエンドとバックエンドの両方をホストしていることだし、彼らは別のサブドメイン上にあります。
バックエンドが、私はAzureのアプリケーションサービスのためにそれを行うための唯一の方法であると信じて、このガイドに従うことによって、クライアント証明書を要求するように設定されています https://docs.microsoft.com/en-us/azure/app-service/app-service-web-configure-tls-mutual-auth
フロントエンドがバックエンドに要求を行うとき、私はwithCredentials
を設定true
にあります。[ドキュメントに従う] [1]は、クライアント証明書でも動作するはずです。
XMLHttpRequest.withCredentialsプロパティは、クロスサイトアクセス制御要求は、このようなクッキー、認証ヘッダやTLSクライアント証明書などの資格情報を使用して行われるべきであるかどうかを示すブールです。 withCredentialsを設定しても、同じサイトの要求には影響しません。
フロントエンドから関連するコード:Chromeで
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers, withCredentials: true });
let apiEndpoint = environment.secureApiEndpoint + '/api/transactions/stored-transactions/';
return this.authHttp.get(apiEndpoint, JSON.stringify(transactionSearchModel), options)
.map((response: Response) => {
return response.json();
})
.catch(this.handleErrorObservable);
これは、要求が行われたときに、ブラウザに証明書をユーザに促し、それがプリフライトリクエストと、すべての作品に含まれます、動作します。
他のすべてのメインブラウザでは、これは当てはまりません。リクエストにクライアント証明書が含まれていない場合、サーバーは接続をシャットダウンするため、Firefox、EdgeおよびSafariはすべてプリフライトリクエストに失敗します。 APIエンドポイントに直接ブラウズ
は、すべてのブラウザは、証明書をユーザーに促しますので、私は、これはほとんどのブラウザは、クライアント証明書とプリフライトリクエストを処理する方法に明示的に関連しているかなり確信しています。
何か問題があったのですか?または、リクエストを行う際に証明書を要求しないことによって、他のブラウザが間違ったことをしていますか?
私はChrome以外のブラウザをサポートする必要があるので、何とか解決する必要があります。
バックエンドに証明書を要求するのではなく、同様の問題が解決されているのを見ました。唯一の問題は、私が実際にAzureアプリケーションサービスでそれを行う方法を見つけていないことです。これは必須か不要かのどちらかです。
どのように私は上に移動することができますか?
リクエストは 'XMLHttpRequest()'または 'fetch()'で行われますか? – guest271314
Chromeでリクエストが正常に機能している場合は、https://stackoverflow.com/posts/46783506/editを使用して質問を編集/更新し、Chrome OPTIONSリクエストのリクエストとレスポンスの詳細を追加してくださいFirefoxの要求に対応しています)と、後続のPOST要求に使用します。 – sideshowbarker
@sideshowbarkerそうです、私は関連するスクリーンキャップで質問を更新しました。 –