2013-08-30 190 views
16

我正在開發一個HTML5移動應用程序,它與WebServices進行通信。 WebServices使用NTLM身份驗證協議。我很難處理通過JavaScript的握手。 NTLM發送401 unauthorized作爲對我的POST的響應,我還沒有找到任何迴應的方式。Javascript/Ajax NTLM身份驗證

是否可以使用JavaScript進行NTLM身份驗證?我應該使用例如基本身份驗證之間?

我的jQuery的電話是一樣的東西......

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

回答

4

據我所看到的,沒有一個人實現Windows集成/ NTLM身份驗證與AJAX,儘管它應該是可能的(我在考慮做它目前的一個項目與WindowsTokenRoleProvider形式的認證)結合

的基本工作流程應該擊穿這樣的(基礎篇herehere):

  1. 做在 「授權」報頭中的64位編碼的類型1 NTLM消息GET請求
  2. 採取base64編碼類型2 NTLM消息 出了「WWW驗證」報頭的在401迴應中。
  3. 對上一步收到的中午執行NTLM操作(對不起,我還沒有代碼示例)
  4. 在「授權」標頭中執行帶有base64編碼類型3 NTLM消息的最終GET 。這應該返回200.

通過HTTP的NTLM身份驗證更多地是使用HTTP的CHAP實現,而不是它是授權的HTTP請求。

我會更新你,如果我真的得到解決這個問題。抱歉,我無法提供更多幫助。

+2

大總結,將不勝感激實現... –

2

問題是你不能通過javascript獲得當前登錄的域/用戶(或者如果你能我從來沒有找到解決方案)。

如果你已經知道了域名,用戶名和密碼,您可以使用類似https://github.com/erlandranvinge/ntlm.js/tree/master

但是我認爲走這方法爲單次登錄將是從長遠來看,令人沮喪。

我們最終在一個隱藏的iframe中進行NTLM身份驗證,並通過javascript訪問iframe。

+0

這是好事,注:沒有辦法,據我可以告訴使用此做CORS(或JSONP)。 – Gram

0

您不必響應NTLM(集成Windows身份驗證)挑戰,如果配置正確,您的瀏覽器應該爲您做。可能還有一些其他併發症。

第1步 - 瀏覽器

檢查瀏覽器可以訪問和使用的NTLM Web應用程序,或按你正在開發直接先將軟件發送您的憑據。

第2步 - JavaScript的withCredentials屬性

收到的401未經授權錯誤描述的症狀是,當我未能設置「withCredentials」屬性「真」一模一樣。我不熟悉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(可選)

我懷疑一個重要原因是人們在這個問題最終是,他們正在開發一個組件在其工作站上與其他組件託管在其他位置這會導致Cross-Origin Resource Sharing (CORS)問題。有兩種解決方案:

  1. 在您的瀏覽器中禁用CORS - 最終將您的工作部署在與您的代碼訪問的資源相同的來源時,這對開發很有用。
  2. 在您的服務器上啓用CORS - 在更廣泛的互聯網上有充足的閱讀,但這基本上涉及發送啓用CORS的標頭。

總之,使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! 
    } 
}