是否可以在XMLHTTPRequest中使用Digest-Authentication?

时间:2011-08-23 10:23:53

标签: javascript http xmlhttprequest web

我有一个简单的问题:是否可以在XMLHTTPRequest中使用Digest-Authentication?

如果答案是否定的,那么技术原因是什么?或者如果有可能 - 我该怎么做?

非常感谢...到目前为止谷歌没有好的答案: - /

编辑:

感谢您的回答。在收到nonce后,修改标头以匹配摘要认证方案似乎是一种解决方案。

但我真正想要的是我可以更改当前的调用:xmlhttp.open(“GET”,url,false,username,password); 某事像那个xmlhttp.open(“GET”,url,false,用户名,密码,“DIGEST”);

这也是我最初提问的一部分:为什么开放式方法不提供制作摘要请求的选项?

也许有js-lib可以推荐让我这样做 - 正如你想象的那样我真的不想将一个简单的xmlhttp.open更改为多个请求并首先得到一个nonce。

6 个答案:

答案 0 :(得分:8)

你可以做到没问题。只需按照您想要的规格部分进行操作;)http://tools.ietf.org/html/rfc2617
,并且只有您缺少开始编写身份验证库的http://pajhome.org.uk/crypt/md5/
在客户端。

预交换用户名和密码
嘿,我想验证---->服务器
好的,这是一个nonce / salt ---->客户
这是我的用户名密码时间戳和盐的md5哈希值----->服务器
我只是以你做的方式加密你的密码和用户名,它们是相同的----->客户端这些是它的基础。

我遗漏了你需要在hashsum中包含所请求资源的URI !!!!
当然,您对服务器的每个请求执行此操作,因为某个拦截哈希的人只能查看您请求的内容,并且无法请求其他资源。此方法不保护数据只是访问权限它。

答案 1 :(得分:6)

看一下这篇文章:http://marcin-michalski.pl/2012/11/01/javascript-digest-authentication-restful-webservice-spring-security-javascript-ajax/。它解释了如何在服务器端使用SpringSecurity进行摘要式身份验证的JavaScript客户端。代码在github中可用:https://github.com/Arrowgroup/JSDigestAuth

答案 2 :(得分:3)

我为此编写了一个完整的工作流程,一旦你使用MD5的外部库(我使用Crypto-js)就不难了。

您可能遇到的最大问题是,在第一台服务器401上,任何最常用的浏览器都会打开一个用于获取凭据的对话框。据我所知,没有简单的方法可以避免这种情况:How can I supress the browser's authentication dialog?

为了解决这个问题,我修改了我从C#codeplex项目编码的网络服务器。 在第一个请求时,客户端传递一个“警告”标题,说“不要引发401”。 服务器创建挑战并使用自定义的非401 HttpException将其发回(我暂时使用406,这在HTTP中是“不可接受的”)。 客户端创建哈希并将其发回。

如果有人感兴趣,我可以发布一些代码片段,这是一个古老的问题。

答案 3 :(得分:0)

执行此操作的最佳方法是使用SSL。我认为不存在任何其他安全解决方案(如果我错了,请纠正我)

答案 4 :(得分:0)

只要您的浏览器支持,您真的不需要关心站点使用哪种身份验证方法。

如果您指定用户名和密码来打开方法,并且不弄乱Authorization标头,则XMLHttpRequest.send()会首先尝试发送未经身份验证的请求,接收带有WWW-Authenticate标头的401响应,然后重试请求,并提供名称和密码根据站点要求的授权方法。

(尽管在此两阶段过程中可能会触发一些额外的事件处理程序)。

答案 5 :(得分:0)

要避免使用默认的浏览器身份验证对话框,您只需将WWW-Authenticate设置为Digest / YourString(例如您的领域)。这完全是第一个响应,不是那么悲惨。我的自定义代码一直运行到昨天,现在,我正在尝试调试突然发生的奇怪事件,但仍在试图理解。