2013-08-30 276 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! 
    } 
}