当用户未经授权访问页面时,我会发送HTTP 401.此外,根据HTTP/1.1 spec的要求,我还会发送WWW-Authenticate
标题。
我知道至少有一种情况,省略此标题会导致问题:Firebug( Net 标签将为空)。
用户可以使用电子邮件地址或用户名以及密码登录。表单通过AJAX提交,JSON响应负责在成功登录后重定向用户,或在失败时显示错误消息。
在Windows Phone 8上,当此标题存在时,会显示自定义对话框。它包含用户名,密码和域的字段。它还有显示密码和记住我的密码的复选框 问题是,这个对话对应用程序的身份验证过程根本不起作用。
标题的价值似乎并不重要,我已尝试使用WWW-Authenticate: form
和WWW-Authenticate: blah
但我无论如何都会得到对话。如何在坚持规范的同时抑制这一点?
答案 0 :(得分:2)
从您的问题和评论看来,您似乎在进行基于表单的身份验证,但是,为了符合HTTP规范,您认为应该返回401
,并且,因为它还需要发送WWW-Authenticate
标题,您也添加了该标题。
事实是:基于表单的身份验证是非标准的,您不应使用401 Unauthorized ,它将与标准HTTP身份验证一起使用。因此,使用虚拟身份验证方法可能会帮助您遵守WWW-Authenticate中的规范字母,但您不应该首先使用401.
spec读取:
10.4.2 401未经授权
请求需要用户身份验证。响应必须包含WWW-Authenticate头字段,其中包含适用于所请求资源的质询。客户端可以使用合适的Authorization标头字段重复请求。
所有这些关于HTTP标头(WWW-Authenticate
和Authorization
)的讨论清楚地表明这是关于为客户端软件提供进行标准HTTP身份验证所需的信息(在大多数情况下通过对话框)
在您想要进行HTTP身份验证时,即WWW-Authenticate
标头,但是使用您自己的身份验证方案而不是 basic时,在Authorization
标头中提供自定义身份验证方法是有意义的或摘要。这当然需要了解自定义方案的客户。
那你可以做什么呢?由于表单身份验证是非标准的,因此未在规范中定义,但如何使用307 Temporary Redirect
将用户重定向到具有登录表单的页面,可能会添加信息以便您可以自动重定向用户在验证凭据后返回他想要访问的页面。