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
});
私が見た限りでは、AJAXでWindows Integrated/NTLM authを実装した人はいませんが、可能です(現在のプロジェクトでフォーム認証とWindowsTokenRoleProviderを組み合わせるためにそれを行うことを検討しています)。
基本的なワークフローshouldこのような内訳(記事に基づく here および ここ ):
HTTPを介したNTLM認証は、承認されたHTTP要求よりも、HTTPを使用したCHAP実装です。
私が実際にこれを実装するようになったら、更新します。すみません、これ以上助けられませんでした。
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つの解決策があります。
つまり、CORSを有効にするには認証情報を使用する必要があります。
これが、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!
}
}
問題は、JavaScript経由で現在ログインしているドメイン/ユーザーを取得できないことです(または、解決策が見つからなかった場合)。
ドメイン、ユーザー名、パスワードがわかっている場合は、 https://github.com/erlandranvinge/ntlm.js/tree/master のようなものを使用できます。
ただし、シングルサインオンでこの方法を使用すると、長期的にはイライラすることになると思います。
最終的に、非表示のiframeでNTLM認証を行い、JavaScriptを介してiframeにアクセスしました。
うん、NTLMはあまり面白くない。しかし、あなたはこれを試してみたいかもしれません https://github.com/tcr/node-ntlm/blob/master/README.md