89

私のWebアプリケーションには、AJAX呼び出しを介して認証資格情報を送信するログインページがあります。ユーザーが正しいユーザー名とパスワードを入力した場合、すべてが正常ですが、そうでない場合は、次のようになります。

  1. Webサーバーは、要求に整形式のAuthorizationヘッダーが含まれていても、ヘッダー内の資格情報が正常に認証されていないと判断します。
  2. Webサーバーは401ステータスコードを返し、サポートされている認証タイプを一覧表示する1つ以上のWWW-Authenticateヘッダーを含みます。
  3. ブラウザは、XMLHttpRequestオブジェクトに対する私の呼び出しへの応答が401であり、応答にWWW-Authenticateヘッダーが含まれていることを検出します。次に、ユーザー名とパスワードの入力を求める認証ダイアログが表示されます。

これは、ステップ3まではすべて問題ありません。ダイアログをポップアップさせたくないので、AJAXコールバック関数で401応答を処理したいと思います。(たとえば、ログインページにエラーメッセージを表示します。)もちろん、ユーザーにユーザー名とパスワードを再入力してもらいたいのですが、ブラウザーの醜いデフォルトではなく、フレンドリーで安心できるログインフォームを表示してもらいたいです。認証ダイアログ。

ちなみに、私はサーバーを制御できないため、カスタムステータスコード(つまり、401以外のもの)をサーバーに返すことはできません。

認証ダイアログを非表示にする方法はありますか?特に、Firefox 2以降で[認証が必要]ダイアログを非表示にできますか?IE 6以降で[ホスト]に接続ダイアログを抑制する方法はありますか?



著者からの追加情報の編集
(9月18日): ブラウザーの認証ダイアログがポップアップする実際の問題は、ユーザーに十分な情報が提供されないことです。

ユーザーは、ログインページのフォームからユーザー名とパスワードを入力したばかりで、両方を正しく入力したと考えており、送信ボタンをクリックするか、Enterキーを押しました。彼の期待は、彼が次のページに移動するか、おそらく彼が自分の情報を間違って入力したので再試行する必要があると言われることです。ただし、代わりに予期しないダイアログボックスが表示されます。

ダイアログは、彼がユーザー名とパスワードを入力したという事実を確認しません。問題があったこと、そして彼が再試行する必要があることを明確に述べていません。代わりに、ダイアログボックスには、「サイトによると:' [レルム] '」などの不可解な情報がユーザーに表示されます。ここで、 [レルム]は、プログラマーだけが愛することができる短いレルム名です。

Webブラウザの設計者は注意します。ダイアログ自体が単によりユーザーフレンドリーである場合、認証ダイアログを抑制する方法を誰も尋ねません。がログインフォームを使用している理由は、製品管理チームがブラウザの認証ダイアログをひどいものと正しく見なしているためです。

4

12 に答える 12

53

私はここで同じ問題に遭遇し、私の会社のバックエンド エンジニアは明らかに良い習慣と考えられる動作を実装しました: URL への呼び出しが 401 を返し、クライアントがヘッダーを設定している場合、サーバーはそのヘッダーをX-Requested-With: XMLHttpRequestドロップしますwww-authenticate応答。

副作用は、デフォルトの認証ポップアップが表示されないことです。

X-Requested-WithAPI 呼び出しのヘッダーが に設定されていることを確認してくださいXMLHttpRequest。もしそうなら、この良い習慣に従ってサーバーの動作を変更する以外に何もすることはありません...

于 2013-11-26T15:31:43.837 に答える
19

次の両方の条件が満たされると、ブラウザはログイン プロンプトを表示します。

  1. HTTP ステータスは 401 です
  2. WWW-Authenticateヘッダーは応答に存在します

HTTP 応答を制御できる場合はWWW-Authenticate、応答からヘッダーを削除できます。ブラウザはログイン ダイアログをポップアップ表示しません。

応答を制御できない場合は、プロキシをセットアップしてWWW-Authenticate、応答からヘッダーを除外できます。

私の知る限り (間違っている場合はお気軽に訂正してください)、ブラウザがWWW-Authenticateヘッダーを受信するとログイン プロンプトが表示されないようにする方法はありません。

于 2015-03-16T16:47:25.100 に答える
17

これが可能だとは思いません。ブラウザの HTTP クライアント実装を使用している場合、常にそのダイアログがポップアップします。2 つのハックが思い浮かびます。

  1. たぶん、Flash はこれを別の方法で処理するので (私はまだ試していません)、Flash ムービーでリクエストを作成すると役立つかもしれません。

  2. 独自のサーバーでアクセスしているサービスの「プロキシ」を設定し、認証ヘッダーを少し変更して、ブラウザーが認識しないようにすることができます。

于 2008-09-18T07:55:54.493 に答える
8

この質問とその回答は非常に古いことを認識しています。しかし、私はここに行き着きました。おそらく他の人もそうするでしょう。

401 を返す Web サービスのコードにアクセスできる場合。この状況では、401 ではなく 403 (禁止) を返すようにサービスを変更するだけです。ブラウザは、403 に応答して資格情報を要求しません。403 は特定のリソースに対して許可されていない認証済みユーザーの正しいコード。OPの状況のようです。

403 に関する IETF ドキュメントから:

アクセスを取得するのに十分ではない有効な資格情報を受け取ったサーバーは、403 (禁止) ステータス コードで応答する必要があります。

于 2016-10-05T15:13:29.990 に答える
4

Mozillaでは、XMLHttpRequestオブジェクトを作成するときに、次のスクリプトを使用してこれを実現できます。

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

2行目はダイアログボックスを防ぎます...

于 2008-10-04T16:41:20.693 に答える
2

jan.vdbergh には真実があります。サーバー側で 401 を別のステータス コードに変更できる場合、ブラウザはポップアップをキャッチして描画しません。別の解決策は、別のカスタム ヘッダーの WWW-Authenticate ヘッダーを変更することです。なぜ別のブラウザーがそれをサポートできないのか、私には信じられません。Firefox のいくつかのバージョンでは、mozBackgroundRequest で xhr 要求を実行できますが、他のブラウザーでは?? ここでは、 Chromium のこの問題に関する興味深いリンクがあります。

于 2012-07-26T09:54:20.633 に答える
2

Mozilla ランドでは、XMLHttpRequest ( docs ) の mozBackgroundRequest パラメータを true に設定すると、これらのダイアログが抑制され、リクエストが単純に失敗します。ただし、ブラウザー間のサポートがどの程度優れているかはわかりません (失敗した要求のエラー情報の品質がブラウザー間で非常に優れているかどうかも含めて)。

于 2009-01-30T04:08:14.387 に答える
2

どのサーバー技術を使用していますか? また、認証に使用する特定の製品はありますか?

ブラウザはその仕事をしているだけなので、401 ステータス コードを返さないようにサーバー側を変更する必要があると思います。これは、認証が失敗したときに単にフォームを返すカスタム認証フォームを使用して実行できます。

于 2008-09-17T18:34:20.037 に答える
0

最近、Samsung Tizen Smart TV 用の Web アプリを開発しているときに、同様の状況に遭遇しました。ローカル ネットワーク全体をスキャンする必要がありましたが、「www-authenticate」ヘッダーが付加された「401 Unauthorized」応答を返す IP アドレスはほとんどありませんでした。「基本」認証タイプ ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication )のため、ユーザーに「ユーザー名」と「パスワード」の入力を要求するブラウザー認証ポップがポップアップしていました。

これを取り除くために、私にとってうまくいった簡単なことは、認証情報を設定することです: Fetc Api Call ( https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch ) を「省略」します。公式ドキュメントには次のように書かれています。

代わりに、ブラウザーが要求に資格情報を含めないようにするには、資格情報を使用します: 'omit'

fetch('https://example.com', {
  credentials: 'omit'
})

于 2021-01-31T08:42:59.177 に答える
0

C# を使用していない人のために、代わりにActionAttributeを返し、基本認証ダイアログを「飲み込みます」。400401

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

次のように使用します。

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

これで時間が節約できることを願っています。

于 2016-05-24T11:16:30.793 に答える