相关疑难解决方法(0)

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

我正在处理的应用程序有一个会话超时值.如果用户之间的交互时间不超过此值,则会尝试加载下一页,然后系统会提示他们登录.

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

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

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

这个领域有什么好处?会Application Login满足吗?

xmlhttprequest http-headers

104
推荐指数
2
解决办法
12万
查看次数

如何禁止浏览器的身份验证对话框?

我的Web应用程序有一个登录页面,通过AJAX调用提交身份验证凭据.如果用户输入正确的用户名和密码,一切都很好,但如果没有,则会发生以下情况:

  1. Web服务器确定虽然请求包含格式良好的Authorization标头,但标头中的凭据无法成功进行身份验证.
  2. Web服务器返回401状态代码,并包含一个或多个WWW-Authenticate标头,列出支持的身份验证类型.
  3. 浏览器检测到对XMLHttpRequest对象的调用的响应是401,响应包括WWW-Authenticate头.然后它会弹出一个身份验证对话框,再次询问用户名和密码.

这一切都很好,直到第3步.我不希望弹出对话框,我想要在我的AJAX回调函数中处理401响应.(例如,通过在登录页面上显示错误消息.)我希望用户重新输入他们的用户名和密码,当然,但我希望他们看到我友好,安心的登录表单,而不是浏览器的丑陋,默认验证对话框.

顺便说一句,我无法控制服务器,所以让它返回自定义状态代码(即401以外的东西)不是一个选项.

有什么办法可以抑制身份验证对话框吗?特别是,我可以在Firefox 2或更高版本中禁止"需要验证"对话框吗?有没有办法在IE 6及更高版本中禁止连接到[主机]对话框?


编辑
作者的其他信息(9月18日):
我应该补充说,浏览器的身份验证对话框弹出的真正问题是它给用户提供的信息不足.

用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了这些用户名和密码,并且他点击了提交按钮或按回车键.他的期望是,他将被带到下一页,或者可能被告知他输入的信息不正确,应该再试一次.但是,他会出现一个意外的对话框.

对话是没有的,他只是一个事实确认没有输入用户名和密码.它没有明确说明存在问题,他应该再试一次.相反,该对话框向用户显示诸如"网站说:' [领域] '之类的神秘信息." 凡[境界]是,只有一个程序员可以爱很短的领域名称.

Web broswer设计师注意到:如果对话框本身更加用户友好,没有人会问如何抑制身份验证对话框.我正在登录表单的全部原因是我们的产品管理团队正确地认为浏览器的身份验证对话框太糟糕了.

javascript ajax http-authentication

79
推荐指数
4
解决办法
5万
查看次数

更正需要授权的资源的http状态代码

如果用户试图访问要求用户登录的页面,则返回正确的http状态代码似乎存在很多混淆.

那么基本上当我显示登录页面时会发送什么状态代码?

我很确定我们需要使用该4xx范围内的状态代码.

我不是在谈论HTTP身份验证,所以至少有一个我们不会使用的状态代码(401 Unauthorized).

现在我们应该使用什么?答案(也在SO上)似乎有所不同:

根据这里的答案,我们应该使用403 Forbidden.

但在状态代码的描述中是:

授权无效,请求不应重复.

嗯,这看起来不是正确的.由于授权WOULD帮助.

所以让我们看看其他答案.这里的答案甚至根本不使用4xx范围而是使用302 Found

302 Found状态代码的描述:

请求的资源暂时驻留在不同的URI下.由于重定向有时可能会被更改,因此客户端应该继续使用Request-URI来处理将来的请求.如果由Cache-Control或Expires头字段指示,则此响应仅可缓存.

我认为这也不是我想要的.因为它不是位于不同URI下的请求资源.而是一个完全不同的资源(登录页面与经过身份验证的内容页面).

所以我走了另一个解决方案令人惊讶地选择了另一个答案.

这个答案建议我们选择400 Bad Request.

此状态代码的说明是:

由于语法格式错误,服务器无法理解请求.客户端不应该在没有修改的情况下重复请求.

我认为服务器理解请求很好,但在用户通过身份验证之前拒绝提供访问权限.

另一个答案也说403答案是正确的,但它的结尾是:

如果这是一个面向公众的网站,你试图根据会话cookie拒绝访问[这就是我所做的],200使用适当的主体来指示需要登录或者302临时重定向到登录页面通常最好.

所以403是正确的,但是200或者302是最好的.

嘿! 这就是我要找的:最好的解决方案.但最好不要和正确的一样吗?为什么它会是最好的?

感谢所有在这个问题上做到这一点的人:)

我知道我不应该太担心它.而且我认为这个问题更具假设性(不是真的,而是因为缺乏一个更好的词而使用它).

但这个问题现在困扰着我一段时间了.

如果我会成为一名经理(他们总是会听到一些很酷的发音),我会说:但是,但是,但是,但是,宁静很重要.:-)

那么:the right way™在上述情况下使用状态代码是什么(如果有的话)?

TL;博士

当用户尝试访问需要登录的页面时,正确的http状态代码响应是什么?

rest http-status-codes

56
推荐指数
4
解决办法
2万
查看次数

休息调用过期会话:HTTP 401响应导致浏览器显示登录窗口

我编写了一个HTML 5应用程序,它使用AngularJS并与在Tomcat上运行的Java REST后端接口.我使用Spring Security来处理登录和安全性.

当用户进入网站时,他被转发到登录页面,该登录页面创建会话并重定向到索引页面.REST调用从服务器加载更多数据,然后使用该会话进行身份验证.如果没有会话,我将回退到基于HTTP的基本身份验证,这样就可以从Web应用程序中单独调用REST端点.

我现在遇到的问题是会话到期时.这会导致HTTP 401 Unauthenticated服务器响应.我以为我可以捕获该错误并使用Javascript将用户重定向回登录页面.但是在调用我的错误处理程序之前,浏览器首先显示一个登录窗口,只有当我单击取消时我的Javascript错误处理程序才能处理响应.

我的问题是,有没有办法阻止浏览器显示此登录窗口?或者这是我的应用程序设计的一般问题?

替代方案可能是根本不使用会话并在应用程序中缓存用户名和密码.然后我需要使用基本身份验证发送每个REST调用,这是一个更好的方法吗?

以下是来自服务器的HTTP响应:

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 999
Date: Mon, 30 Sep 2013 11:00:34 GMT
Run Code Online (Sandbox Code Playgroud)

更新:看起来原因是WWW-Authenticate标题,导致浏览器显示登录对话框.

rest session http spring-security session-timeout

11
推荐指数
1
解决办法
4926
查看次数

错误 403 的 HTTP 规范中的“授权无济于事”是什么意思?

HTTP 1.1规范说:

10.4.4 403 禁止

服务器理解请求,但拒绝满足它。
授权无济于事,不应重复该请求。[...]

这是否仅意味着“基本授权”,如WWW-Authenticate: Basic?对于某些其他用户可能通过基本 HTTP 身份验证以外的方式(例如通过他的会话 cookie、OpenID 等)访问被拒绝资源的资源,是否应该发出 403?

我问这个是因为 HTTP 401 说...

响应必须包含一个WWW-Authenticate header字段

...我不确定我是否真的应该添加一个像WWW-Authenticate: Custom.

许多人似乎使用 403,即使在一个简单的 cookie 可以使资源可用的情况下也是如此。他们都错了吗?

authentication standards http http-status-code-403 http-status-code-401

5
推荐指数
1
解决办法
4386
查看次数