web-dev-qa-db-ja.com

JavaScript / Ajax NTLM認証

WebServicesと通信するHTML5モバイルアプリを開発しています。 WebServicesはNTLM認証プロトコルを使用します。 JavaScriptを介してハンドシェイクを処理するのが困難です。 NTLMは401 unauthorized私のPOSTへの応答として。

JavaScriptでNTLM認証は可能ですか?プロキシWebサービスを構築する必要がありますか?中間の基本認証?

私のjQuery呼び出しは次のようなものです...

$.ajax({
                    type: "POST",
                    url: URL,
                    contentType: "text/xml",
                    dataType: "xml",
                    data: soapRequest,
                    username: 'username',
                    password: 'password',
                    xhrFields: {
                        withCredentials: true
                    },
                    success: processSuccess,
                    error: processError
});
20
TryCatch

私が見た限りでは、AJAXでWindows Integrated/NTLM authを実装した人はいませんが、可能です(現在のプロジェクトでフォーム認証とWindowsTokenRoleProviderを組み合わせるためにそれを行うことを検討しています)。

基本的なワークフローshouldこのような内訳(記事に基づく here および ここ ):

  1. "Authorization"ヘッダーにbase64でエンコードされたタイプ1 NTLMメッセージを含むGETリクエストを実行する
  2. 401応答の「WWW-Authenticate」ヘッダーからbase64でエンコードされたタイプ2 NTLMメッセージを取り出します。
  3. 前のステップで受け取った昼間にNTLM操作を実行します(申し訳ありませんが、まだコード例はありません)
  4. "Authorization"ヘッダーにbase64でエンコードされたタイプ3 NTLMメッセージを使用して最終的なGETを実行します。これは200を返します。

HTTPを介したNTLM認証は、承認されたHTTP要求よりも、HTTPを使用したCHAP実装です。

私が実際にこれを実装するようになったら、更新します。すみません、これ以上助けられませんでした。

5
Doct0rZ

NTLM(統合Windows認証)チャレンジに応答する必要はありません。適切に構成されていれば、ブラウザーが応答します。多くの追加の合併症も起こりそうです。

ステップ1-ブラウザ

ブラウザーがNTLM Webアプリケーションを使用して、または最初に直接開発しているソフトウェアにアクセスして、資格情報にアクセスして送信できることを確認します。

Step 2-JavaScript withCredentials attribute

401 Unauthorizedエラーを受け取り、説明されている症状は、「withCredentials」属性を「true」に設定できなかった場合とまったく同じです。私はjQueryに精通していませんが、その属性を設定する試みが成功していることを確認してください。

この例は私にとってはうまくいきます:

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
  if (xhttp.readyState === XMLHttpRequest.DONE) {
    if (xhttp.status === 200)
      doSomething(xhttp.responseText);
    else
      console.log('There was a problem with the request.');
  }
};

ステップ3-サーバー側でCORSを有効にする(オプション)

私が人々がこの質問に終わる主な理由は、別の場所でホストされている別のコンポーネントを使用して、ワークステーションで1つのコンポーネントを開発していることだと思います。これにより Cross-Origin Resource Sharing(CORS) の問題が発生します。 2つの解決策があります。

  1. ブラウザでCORSを無効にします。コードがアクセスしているリソースと同じOriginに最終的に作業がデプロイされる場合は、開発に適しています。
  2. サーバーでCORSを有効にします-より広いインターネットで十分な読み取りがありますが、これには基本的にCORSを有効にするヘッダーの送信が含まれます。

つまり、CORSを有効にするには認証情報を使用する必要があります。

  • 提供されたページのオリジンと一致する「Access-Control-Allow-Origin」ヘッダーを送信します... これは '*'にはできません
  • 「Access-Control-Allow-Credentials」を値「true」で送信します

これが、global.asaxファイルにある.NETコードのサンプルです。何が起こっているのかを確認し、必要に応じて他の言語に翻訳するのは非常に簡単だと思います。

void Application_BeginRequest(object sender, EventArgs e)
{
    if (Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        Response.AddHeader("Access-Control-Max-Age", "1728000");
        Response.End();
    }
    else
    {
        Response.AddHeader("Access-Control-Allow-Credentials", "true");

        if (Request.Headers["Origin"] != null)
            Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
        else
            Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt!
    }
}
5
QA Collective

問題は、JavaScript経由で現在ログインしているドメイン/ユーザーを取得できないことです(または、解決策が見つからなかった場合)。

ドメイン、ユーザー名、パスワードがわかっている場合は、 https://github.com/erlandranvinge/ntlm.js/tree/master のようなものを使用できます。

ただし、シングルサインオンでこの方法を使用すると、長期的にはイライラすることになると思います。

最終的に、非表示のiframeでNTLM認証を行い、JavaScriptを介してiframeにアクセスしました。

3
Kinetic

うん、NTLMはあまり面白くない。しかし、あなたはこれを試してみたいかもしれません https://github.com/tcr/node-ntlm/blob/master/README.md

0