我有一个简单的问题:是否可以在XMLHTTPRequest中使用Digest-Authentication?
如果答案是否定的,那么技术原因是什么?或者如果有可能 - 我该怎么做?
非常感谢...到目前为止谷歌没有好的答案: - /
编辑:
谢谢你的回答 . 在收到nonce后,修改标头以匹配摘要认证方案似乎是一种解决方案 .
但我真正想要的是我可以改变我当前的调用:xmlhttp.open(“GET”,url,false,用户名,密码);某事像那个xmlhttp.open(“GET”,url,false,用户名,密码,“DIGEST”);
这也是我最初的问题的一部分:为什么open方法不提供做出摘要请求的选项?
也许有js-lib可以推荐让我这样做 - 正如你想象的那样我真的不想将一个简单的xmlhttp.open更改为多个请求并首先得到一个nonce .
5 回答
你可以做到没问题 . 只需按照你想要的规格部分;)
http://tools.ietf.org/html/rfc2617
并且是您开始编写身份验证库时所缺少的
http://pajhome.org.uk/crypt/md5/
在客户端 .
预交换用户名和密码
嘿,我想验证---->服务器
好的,这是一个nonce / salt ---->客户端
这是我的用户名密码时间戳和盐----->服务器的md5哈希值
我只是以你做的方式加密你的密码和用户名,他们是相同的----->客户端
这些是它的基础 .
我遗漏了你需要在hashsum中包含所请求资源的URI!
当然,您对服务器的每个请求执行此操作,因为某个拦截哈希的人只能查看您请求的内容,并且无法请求其他资源 . 此方法不保护数据只是访问权限它 .
看看这篇文章:http://marcin-michalski.pl/2012/11/01/javascript-digest-authentication-restful-webservice-spring-security-javascript-ajax/ . 它解释了如何在服务器端使用SpringSecurity进行摘要式身份验证的JavaScript客户端 . 代码在github中可用:https://github.com/Arrowgroup/JSDigestAuth
我为此编写了一个完整的工作流程,一旦你使用MD5的外部库(我使用Crypto-js)就不难了 .
您可能遇到的最大问题是,在第一台服务器401上,任何最常用的浏览器都会打开一个用于获取凭据的对话框 . 据我所知,没有简单的方法来规避这个:How can I supress the browser's authentication dialog?
为了解决这个问题,我修改了我从C#codeplex项目编码的网络服务器 . 在第一个请求时,客户端传递一个“警告” Headers ,说“不要提高401” . 服务器创建挑战并使用自定义的非401 HttpException将其发回(我暂时使用406,这在HTTP中是“不可接受的”) . 客户端创建哈希并将其发回 .
如果有人感兴趣,我可以发布一些代码片段,这是一个古老的问题 .
最好的方法是使用SSL . 我认为不存在任何其他安全解决方案(如果我错了,请纠正我)
只要您的浏览器支持,您真的不应该关心网站使用哪种身份验证方法 .
如果指定用户名和密码来打开方法并且不要弄乱Authorization标头,XMLHttpRequest.send()将首先尝试发送请求而不进行身份验证,使用WWW-Authenticate标头接收401响应,并重试请求,提供名称和密码 . 到网站要求的授权方法 .
(虽然在这个两阶段过程中可能会有一些额外的事件处理程序) .