默认发送 BASIC auth,而不是等待 HTTP 401

Posted

技术标签:

【中文标题】默认发送 BASIC auth,而不是等待 HTTP 401【英文标题】:Send BASIC auth by default, rather than wait for HTTP 401 【发布时间】:2013-03-09 01:10:08 【问题描述】:

我有一个 Web 服务要求在请求中包含 BASIC 身份验证标头,否则该服务将返回 HTTP 401(未经授权)。这有效 - 当挑战回来时,浏览器(在本例中为 Chrome)会弹出并要求提供凭据。然后保存它们以供将来请求。

我的问题是,现在对服务的每个后续请求都会发出两个请求 - 一个没有身份验证(收到 401),然后浏览器立即回复标头中的正确身份验证。

有没有办法强制浏览器(可能通过特殊的标头)提供凭据,而不必每次都被 Web 服务明确询问?

【问题讨论】:

【参考方案1】:

我认为强制浏览器抢占 401 是不可能的。当对您的服务发出请求时,服务会以 HTTP 401 响应并添加 WWW-Authenticate Basic 标头,我猜,一个领域(您可以定义)。

有必要查看基本身份验证的 RFC,其中详细介绍了应如何实施基本身份验证标准。 http://www.ietf.org/rfc/rfc2617.txt

您还可以考虑实现自己的 HTTP 模块,这应该可以为您的应用程序以及如何处理基本身份验证提供更大的灵活性。这允许您为 Authenticate 和 End Request 事件注册事件处理程序,并更清楚地指示您的服务将如何处理基本身份验证。 asp.net 网站上提供了这方面的入门指南。 http://www.asp.net/web-api/overview/security/basic-authentication

如果您的服务根据您的应用程序身份验证使用不同的身份验证(例如,当应用程序配置为表单身份验证时,该服务将仅使用基本身份验证)而不是使用 HTTP 模块将允许您有条件地使用基本身份验证。我通常像这样在这种情况下注册我的处理程序:

AuthenticationSection config = (AuthenticationSection)WebConfigurationManager.GetSection("system.web/authentication");

if(config.Mode == AuthenticationMode.Forms)

    module.Authenticate += OnEnter;
    context.EndRequest += OnLeave;

【讨论】:

+1;我已经自己处理了基本的身份验证服务器端,并使用标头进行响应,浏览器最终会弄清楚。我的问题出在浏览器上,我不知道是否有一种标准方法可以让它表现得更好。 我相信您在第 1 段和第 2 段中的观察是正确的(帖子的其余部分与我的情况并不真正相关)。此问题似乎已在更高版本的 Chrome 中得到解决,因为它现在会自动发送身份验证。 为什么这甚至是标准?

以上是关于默认发送 BASIC auth,而不是等待 HTTP 401的主要内容,如果未能解决你的问题,请参考以下文章

java 发送带Basic Auth认证的http post请求

PHP Digest/Basic Auth 默认窗口外观

Nginx下配置Http Basic Auth保护目录

htpasswd的使用

HTTP Basic Auth:BA 认证

Spring starter security-basic auth-vai zuul 服务器