HTTP401-什么是合适的 WWW-验证头的值?

我目前正在处理的应用程序具有会话超时值。如果用户的交互时间没有超过这个值,那么在他们试图加载的下一个页面中,系统会提示他们登录。

所有发出的请求都通过这种机制进行路由,其中包括 AJAX 调用。最初,我们发送了一个200头登录页面,这引入了一些与 AJAX 的问题,因为代码运行,如果一个200响应发送,和大多数数据发送回来,从这些 RPC 调用是 JSON 或原始的 JavaScript 得到评估(不要问: |)。

我建议使用401更好,因为我们的 JSON 解析器不会尝试使用 HTML 登录页. . :)

但是,当 看说明书时,我注意到 WWW-Authenticate字段也必须发送。

这个字段的好值是什么? Application Login是否足够?

139934 次浏览

不,您必须指定要使用的身份验证方法(通常是“ Basic”)和身份验证领域。有关请求和响应的示例,请参见 http://en.wikipedia.org/wiki/Basic_access_authentication

您可能还想阅读 Rfc2617-HTTP 认证: 基本和 HTTP摘要认证

当指示 HTTP 基本身份验证时,我们返回如下内容:

WWW-Authenticate: Basic realm="myRealm"

Whereas Basic is the scheme and the remainder is very much dependent on that scheme. In this case realm just provides the browser a literal that can be displayed to the user when prompting for the user id and password.

但是,您显然没有使用 Basic,因为当使用 Basic Auth 时,会话到期是没有意义的。我假设您正在使用某种形式的基于表单的身份验证。

根据回忆,Windows 挑战响应使用不同的方案和不同的参数。

诀窍在于,这取决于浏览器决定它支持哪些方案,以及它如何响应这些方案。

我的直觉告诉我,如果你使用的是基于表单的身份验证,你应该保留200多个重新登录页面,但是添加一个浏览器会忽略但是你的 AJAX 可以识别的自定义头部。

为了获得一个真正好的 User + AJAX 体验,让脚本保留发现会话过期的 AJAX 请求,通过弹出窗口发出重新登录请求,成功后,重新提交原始的 AJAX 请求并像往常一样继续。

避免那种每5分钟就让脚本访问站点以保持会话活动的作弊行为,因为那样只会破坏会话到期点。

The other alternative is burn the AJAX request but that's a poor user experience.

When the user session times out, I send back an HTTP 204 status code. Note that the HTTP 204 status contains no content. On the client-side I do this:

xhr.send(null);
if (xhr.status == 204)
Reload();
else
dropdown.innerHTML = xhr.responseText;

下面是 Reload ()函数:

function Reload() {
var oForm = document.createElement("form");
document.body.appendChild(oForm);
oForm.submit();
}