ブラウザの認証ダイアログを非表示にするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/86105

質問

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

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

ステップ 3 まではこれで問題ありません。ダイアログをポップアップ表示したくないのですが、AJAX コールバック関数で 401 応答を処理したいのです。(たとえば、ログイン ページにエラー メッセージを表示するなど)認証ダイアログ。

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

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


編集
著者からの追加情報(9月)18):
ブラウザーの認証ダイアログがポップアップ表示される本当の問題は、ユーザーに十分な情報が提供されないことであることを付け加えておきます。

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

ダイアログでは、彼がただ単に した ユーザー名とパスワードを入力します。問題があったのでもう一度やり直す必要があるとは明確に述べられていません。代わりに、ダイアログ ボックスには「サイトには次のように書かれています:'[レルム]'。" どこ [レルム] は、プログラマのみが好む短いレルム名です。

Web ブラウザの設計者は次の点に注意してください。ダイアログ自体が単にもっとユーザーフレンドリーであれば、認証ダイアログを抑制する方法を尋ねる人はいないでしょう。の 全体 私がログイン フォームを使用している理由は、弊社の製品管理チームがブラウザの認証ダイアログがひどいものであると当然考えているからです。

役に立ちましたか?

解決

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

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

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

他のヒント

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

副作用として、デフォルトの認証ポップアップが表示されません。

API 呼び出しに X-Requested-With ヘッダーを次のように設定 XMLHttpRequest. 。その場合は、このグッドプラクティスに従ってサーバーの動作を変更する以外に何もすることはありません...

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

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

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

応答を制御できない場合は、プロキシを設定して、 WWW-Authenticate 応答のヘッダー。

私の知る限り (間違っていたら遠慮なく訂正してください)、ブラウザがログインプロンプトを受信すると、ログインプロンプトを防ぐ方法はありません。 WWW-Authenticate ヘッダ。

この質問とその答えは非常に古いものであることがわかりました。でも、結局ここに来てしまった。おそらく他の人も同様にそうするでしょう。

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

403 に関する IETF 文書より:

アクセスを獲得するのに適切でない有効な資格情報を受信するサーバーは、403(禁止)ステータスコードで応答する必要があります

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

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

2行目はダイアログボックスを表示させません...

どのようなサーバー テクノロジを使用していますか?また、認証に使用する特定の製品はありますか?

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

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

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

MVC 5 と VPN でもこれと同じ問題があり、VPN を使用して DMZ の外にいるときは常に、このブラウザ メッセージに応答しなければなりません。.net を使用すると、エラーのルーティングを単純に処理します。

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

これまでのところ、ホーム コントローラーの Index アクションがユーザーを検証しているため、機能しています。このアクションのビューには、ログオンが失敗した場合に、ディレクトリ サービスに渡される LDAP クエリを使用してユーザーをログインさせるために使用するログイン コントロールがあります。

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

これはこれまでのところ正常に機能していますが、まだテスト中であり、上記のコードは実行する理由がないため、削除される可能性があることをお知らせしなければなりません...現在のテストには、2 番目のコード セットがさらに役立つケースを発見する試みが含まれています。繰り返しますが、これは進行中の作業ですが、何らかの助けになったり、アイデアを得るために頭を動かしたりする可能性があるため、今追加することにしました...すべてのテストが完了したら、最終結果を更新します。

C# を知らない人のためにここにあります ActionAttribute それは戻ってきます 400 の代わりに 401, 、および基本認証ダイアログを「飲み込みます」。

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
}

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

私はNode、Express、Passportを使用していますが、同じ問題に苦労していました。明示的に設定することで機能するようにしました www-authenticate ヘッダーを空の文字列に変換します。私の場合、次のようになりました。

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

それが誰かの役に立てば幸いです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top