8

最近の sharepoint プロジェクトで、NTLM 認証ダイアログ ボックスを置き換える認証 Web パーツを実装しました。ユーザーが有効な資格情報を提供する限り、正常に機能します。ユーザーが無効な資格情報を提供するたびに、NTLM ダイアログ ボックスが Internet Explorer に表示されます。

XmlHttpRequest を介して認証を行う私の Javascript コードは次のようになります。

function Login() {
   var request = GetRequest(); // retrieves XmlHttpRequest
   request.onreadystatechange = function() {
      if (this.status == 401) {     // unauthorized request -> invalid credentials
         // do something to suppress NTLM dialog box...
         // already tried location.reload(); and window.location = <url to authentication form>;
      }
   }
   request.open("GET", "http://myServer", false, "domain\\username", "password");
   request.send(null);
}

ユーザーが無効な資格情報を提供したときに NTLM ダイアログ ボックスを表示したくありません。代わりに、認証フォームのログイン ボタンによるポストバックを実行する必要があります。言い換えれば、ブラウザは私の無許可のリクエストを見つけるべきではありません.

Javascriptを介してこれを行う方法はありますか?

4

3 に答える 3

5

マークのコメントは正しいです。NTLM 認証プロンプトは、401 応答コードと、WWW-Authenticate ヘッダーで提供される最初のメカニズムとしての NTLM の存在によってトリガーされます (参照: NTLM 認証プロトコル)。

質問の説明を正しく理解しているかどうかわかりませんが、SharePoint の NTLM 認証をラップしようとしていると思います。つまり、サーバー側の認証プロトコルを制御できないということですよね? 失敗した認証情報に対して 401 応答を送信することを回避するためにサーバー側を操作できない場合、この問題を回避することはできません。これは (クライアント側の) 仕様の一部であるためです。

XMLHttpRequest オブジェクト

UA が HTTP 認証 [RFC2617] をサポートしている場合、このオブジェクトから発信されたリクエストは、アクセスされた URI を含む保護スペースの一部であると見なし、Authorization ヘッダーを送信し、401 Unauthorized リクエストを適切に処理する必要があります。認証が失敗した場合、UA はユーザーに資格情報を要求する必要があります。

したがって、この仕様では、ユーザーが URL に直接アクセスしたかのように、XMLHttpRequest で 401 応答が受信された場合に、それに応じてブラウザーがユーザーにプロンプ​​トを表示するよう実際に要求しています。マークが述べたように、これを実際に回避する唯一の方法は、サーバー側を制御し、401 Unauthorized 応答を回避することです。

最後に 1 つ考えられるのは、別の Web サーバー上の別のサーバー側スクリプトなど、プロキシを使用してこれを回避できる可能性があるということです。次に、そのスクリプトはユーザーを受け取り、パラメーターを渡し、認証をチェックします。これにより、ユーザーのブラウザーは元の HTTP 要求を作成しているものではなく、プロンプトの原因となっている 401 応答を受信しません。このようにすると、失敗した場合は「プロキシ」スクリプトから確認できます。失敗した場合は、成功するまでユーザーに再度プロンプトを表示します。認証イベントが成功すると、資格情報が正しく指定されていればすべてが機能するため、現在のように HTTP 要求を取得するだけで済みます。

于 2008-10-03T06:06:29.120 に答える
3

IIRC では、リクエスト ストリームに次のものが返されると、ブラウザーは認証ダイアログをポップします。

  • 401 の HTTP ステータス
  • WWW 認証ヘッダー

どちらかまたは両方を抑える必要があると思います。これを行う簡単な方法は、Base64 のユーザー名とパスワード (HTTPS を使用していますよね?) を受け取り、有効/無効のステータスで 200 を返すログイン メソッドを用意することです。パスワードが検証されると、XHR で使用できます。

于 2008-08-27T11:10:36.737 に答える
0

Firefox を除くすべてのブラウザでこれを機能させることができました。数年前の以下のブログ記事を参照してください。私の投稿は IE のみを対象としていますが、コードを少し変更すれば、Chrome と Safari でも動作するはずです。

http://steve.thelineberrys.com/ntlm-login-with-anonymous-fallback-2/

編集:

私の投稿の要点は、JS xml 呼び出しを try catch ステートメントでラップすることです。IE、Chrome、および Safari では、これにより NTLM ダイアログ ボックスが抑制されます。firefox では期待通りに動作しないようです。

于 2013-06-11T14:23:40.533 に答える