26

IIS6 で ASP.NET 3.5 を実行している大規模な社内 Web ベース アプリケーションで、401 の「無許可」応答とそれに続く 200 の「OK」応答 (Fiddler によるプロファイル) を生成する状況があります。なぜこれが起こっているのか(統合認証がブラウザに資格情報の再送信を強制する)を認識していますが、状況を最小限に抑えるか根絶する方法についていくつかの考えを探しています. 問題のアプリケーションは WAN で実行されており、一部のユーザーは最大 250 ミリ秒の遅延を経験しているため、特にページの作成にカスケード ドロップダウン リストが多数ある場合、後続の要求を強制すると、ページの読み込み時間に顕著な影響を与える可能性があります。

アプリケーションのユーザーは、管理されたデスクトップ環境の内部にいるため、最初の要求でブラウザーに強制的に資格情報を送信させるメカニズム (これは可能ですか?) は、展開の観点から可能です。これは、ユーザーの ID を必要とするページでは機能しますが、認証を必要としないリソース (WebResource.axd、ScriptResource.axd、および一部のカスタム Web サービス) では機能し、匿名認証が可能になります。これを web.config の場所ごとに定義することを検討しましたが、結果はまちまちでした (まだ 401 応答の数)。

この状況に対処するための「ベスト プラクティス」に関するガイダンスをいただければ幸いです。問題を特定するリソースはたくさんありますが、実行可能な解決策を提供するものはありません。

ありがとう!

編集:認証を必要としないリソース(つまり、ドロップダウンリストのカスケードに使用されるWebサービス)は、場所のエントリをWeb構成に追加することで匿名で要求できますが、認証されたリソースの答えはまだ見つかりません.

4

5 に答える 5

17

残念ながら、これはHTTP NTLM 認証方式の成果物です。

WWW-Authenticateつまり、ブラウザー (Internet Explorer など) は、応答ヘッダーを含む 401 応答でバウンスされるまで、認証が必要であることをまったく認識しません。

WWW-Authenticate: NTLM厄介なことに、完了するには 1 つの永続的な接続で 2 つの 401 応答が必要であり、HTTP の永続的な接続が閉じられると、このプロセスを繰り返す必要があります。そのため、たとえブラウザーにやみくもに NTLM を試みる要求を開始させることができたとしても、少なくとも 1 つの 401 応答をトランザクションから削除することはできません。

アイドル時に永続的な接続が開いたままになる時間を最大化するのが最善の策だと思います。

于 2009-04-30T00:37:45.787 に答える
0

「about:config」設定を使用して、ホワイトリストに登録された一連のドメインに NTLM 資格情報を自動的に送信するように Firefox を説得できると思います - 「network.automatic-ntlm-auth.trusted-uris」設定を使用します。私はこれを自分で試したことはありません。Internet Explorer に相当するものがあるかどうかはわかりません。

残念ながら、Kerberos などを使用している場合、401 を回避する方法はないようです。

于 2009-03-29T08:22:48.150 に答える
0

401 による待機時間が長すぎる場合は、フォーム認証を検討する必要がある場合があります。ユーザーは明示的にログインする必要がありますが、1 回だけです。次に、Cookie または Cookieless スキームを使用して、最初の試行で応答を取得できます。

カスケード ドロップダウンがあり、最初のページの読み込みで 1 つの値が入力され、POST が次のリストを取得し、その値を設定し、別の POST で次のリストを再度取得するなどの場合、ページの読み込みが遅くなると思います。このような場合は、POST 応答を待つのではなく、最初のラウンドトリップですべてのドロップダウンを入力する必要があるかもしれません。

于 2009-05-01T05:16:16.827 に答える
0

TL;DR HTTPヘッダー情報をHTTPボディに入れました

私の例は Angular ですが、どの TypeScript/JavaScript (フレームワーク) でも同じ問題が発生する可能性があります。

ログインしたユーザー情報を含むヘッダーを必要とするバックエンド API への HTTP ポスト コールを実行するときに、HTTP 本文があるべき場所に HTTP ヘッダーを追加しましたが、ヘッダーが空でした。

問題

  markInstructionAsCompleted(visitScheduleId: string, instructionId: number) {
    return this.http.post(`${environment.apiUrl}/VisitInstructions/schedule/${visitScheduleId}/done/${instructionId}`, this.getHeaderWithAuthorization());
  }

解決策として、HTTP post 呼び出しに 2 番目の引数が追加されていることに注意してください。null

  markInstructionAsCompleted(visitScheduleId: string, instructionId: number) {
    return this.http.post(`${environment.apiUrl}/VisitInstructions/schedule/${visitScheduleId}/done/${instructionId}`, null, this.getHeaderWithAuthorization());
  }
于 2020-04-30T11:17:53.693 に答える