HTTP 401-什么是适当的WWW-Authenticate标头值?


109

我目前正在处理的应用程序具有会话超时值。如果用户的交互时间不超过此值,则他们尝试加载的下一页将被提示登录。

发出的所有请求都通过此机制进行路由,其中​​包括AJAX调用。最初,我们在登录页面上发送了200标头,这引入了AJAX的一些问题,因为如果发送200响应,则代码会运行,并且从这些RPC调用返回的大多数数据都是JSON或经过评估的原始JavaScript(请勿问:|)。

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

但是,在阅读规范时,我注意到WWW-Authenticate还必须发送该字段。

这个领域有什么好的价值?将Application Login足够?

Answers:


67

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

WWW-Authenticate: Basic realm="myRealm"

Basic正是这项计划,其余是对方案非常依赖。在这种情况下,领域仅向浏览器提供一个文字,当提示用户ID和密码时可以显示给用户。

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

从回忆来看,Windows挑战响应使用了不同的方案和不同的参数。

诀窍在于,由浏览器决定它支持什么方案以及如何响应它们。

我的直觉是,如果您使用基于表单的身份验证,则停留在200 +重新登录页面上,但是添加一个自定义标头,浏览器将忽略该标头,但您的AJAX可以识别。

为了获得真正好的用户+ AJAX体验,请获取脚本以挂接到发现会话已过期的AJAX请求上,通过弹出窗口触发重新登录请求,并在成功后重新提交原始AJAX请求并照常进行。

避免仅使脚本每5分钟访问站点一次的作弊手段,以使会话保持活动状态,而这只会使会话失效。

另一种选择是刻录AJAX请求,但这是糟糕的用户体验。


2
感谢队友,我现在使用的是403,因为它不是重定向,并且实际上包含了登录表单来代替原始页面。它还更好地符合W3规范。感谢您提供的信息。
Will Morgan

2
看到这个答案你如何仍然可以使用HTTP 401:stackoverflow.com/questions/928874/...
lanoxx

是的,我想将任何内容都放在WWW-Authenticate标头中。与此类似的另一个答案是stackoverflow.com/a/1088127/689161或只是违反规范而不必打扰发送标头(至少有几个站点这样做)。401比403更合适
。– gengkev

我不确定是否会在WWW-Authenticate标头中“放任何东西”,因为我不确定该请求是由我的Ajax还是由浏览器处理的。除了这个问题的标题之外,给出建议基于表单的身份验证的详细信息,我将完全不发送WWW-Authenticate标头。这是因为我并不是要求浏览器参与身份验证/凭据挑战。我只希望它显示一个恰好是登录表单的表单,但是ajax可以使用某些东西来标识它是登录表单,因此它可以像上面一样处理它。
斯瓦尼

您应该组成一个可与标头一起使用的身份验证方案。这样浏览器就不会参与其中,因为它不会理解该方案。如果您不包含标题,则某些客户端会感到沮丧或困惑。
KayEss


-7

当用户会话超时时,我发回HTTP 204状态代码。请注意,HTTP 204状态不包含任何内容。在客户端,我这样做:

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();
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.