HTTP 基本身份验证 - 预期的 Web 浏览器体验是啥?

Posted

技术标签:

【中文标题】HTTP 基本身份验证 - 预期的 Web 浏览器体验是啥?【英文标题】:HTTP Basic Authentication - what's the expected web browser experience?HTTP 基本身份验证 - 预期的 Web 浏览器体验是什么? 【发布时间】:2011-01-03 21:35:42 【问题描述】:

当服务器允许通过基本 HTTP 身份验证进行访问时,在网络浏览器中的预期体验是什么?

暂时忽略网络浏览器,以下是使用curl 创建基本身份验证请求的方法:

curl -u myusername:mypassword http://somesite.com

但是在 Web 浏览器中呢?我在一些网站上看到的,是我访问了 URL,然后服务器返回响应码 401。然后浏览器显示用户名/密码提示。

但是,在 somesite.com 上,我根本没有收到授权提示,只是显示我未获得授权的页面。是否某些站点没有正确实施基本身份验证工作流程,还是我需要做其他事情?

【问题讨论】:

您确定您使用的是 Basic Auth 而不是 Digest? 不确定区别,除非您问我是否使用 base-64 编码。如果我以编程方式执行此操作,它会,但 curl 为我执行此操作。 您可以从 WWW-Authenticate 响应头(值:Digest 或 Basic)中了解使用的身份验证。 我认为这个问题需要重新表述。不止一位受访者认为这是关于 curl 而不是浏览器的问题。 当您使用“授权”一词时,您的意思是“身份验证”吗? 【参考方案1】:

为了帮助大家避免混淆,我将把问题重新表述为两部分。

首先:“如何使用 BASIC auth 向浏览器发出经过身份验证的 HTTP 请求?”.

在浏览器中,您可以先执行 http 基本身份验证,方法是等待提示出现,如果您遵循以下格式,则可以编辑 URL:http://myusername:mypassword@somesite.com

注意:如果您安装了命令行和 curl,则问题中提到的 curl 命令非常好。 ;)

参考资料:

https://en.wikipedia.org/wiki/Basic_access_authentication#URL_encoding https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax https://www.rfc-editor.org/rfc/rfc3986#page-18

也根据 CURL 手册页https://curl.haxx.se/docs/manual.html

HTTP

  Curl also supports user and password in HTTP URLs, thus you can pick a file
  like:

      curl http://name:passwd@machine.domain/full/path/to/file

  or specify user and password separately like in

      curl -u name:passwd http://machine.domain/full/path/to/file

  HTTP offers many different methods of authentication and curl supports
  several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which
  method to use, curl defaults to Basic. You can also ask curl to pick the
  most secure ones out of the ones that the server accepts for the given URL,
  by using --anyauth.

  NOTE! According to the URL specification, HTTP URLs can not contain a user
  and password, so that style will not work when using curl via a proxy, even
  though curl allows it at other times. When using a proxy, you _must_ use
  the -u style for user and password.

第二个也是真正的问题是 “但是,在 somesite.com 上,我根本没有收到授权提示,只是显示我未获得授权的页面。某些网站没有实施基本身份验证工作流程吗?正确,还是我需要做其他事情?”

curl 文档说-u 选项支持多种身份验证方法,Basic 是默认设置。

【讨论】:

问题是curl,不是浏览器。 您可能还没有完全阅读这个问题,因为它在 curl 命令下说:“但是,现在我无法访问 curl(长话短说),我只想做如果可能,请从网络浏览器中获取。” ;) 我完全同意 curl 工作正常,我个人经常使用它,但问题不在于 curl... 提问者想知道为什么要进行身份验证。在浏览器中不起作用。问题不在于 cURL。【参考方案2】:

你试过了吗?

curl somesite.com --user username:password

【讨论】:

@daronwolff 您只切换了参数位置并将 -u 替换为 --user (这只是长期的),但除此之外,您写的正是 OP 在他的问题中已经写的内容跨度> 提问者想知道为什么要进行身份验证。在浏览器中不起作用。问题不在于 cURL。【参考方案3】:

您的浏览器中可能缓存了旧的无效用户名/密码。尝试清除它们并再次检查。

如果您使用的是 IE,并且 somesite.com 在您的 Intranet 安全区域中,则 IE 可能会自动发送您的 Windows 凭据。

【讨论】:

【参考方案4】:

WWW-身份验证标头

如果服务器正在发送 401 响应代码但未正确设置 WWW-Authenticate 标头,您也可能会收到此问题 - 我应该知道,我刚刚在自己的代码中修复了这个问题,因为 VB 应用程序没有弹出身份验证提示。

【讨论】:

【参考方案5】:

如果请求标头中没有提供凭据,以下是 IE 提示用户输入凭据并重新提交请求所需的最低响应。

Response.Clear();
Response.StatusCode = (Int32)HttpStatusCode.Unauthorized;
Response.AddHeader("WWW-Authenticate", "Basic");

【讨论】:

【参考方案6】:

您可以使用 Postman 的 chrome 插件。 它使您能够为每个请求选择所需的身份验证类型。 在该菜单中,您可以配置用户和密码。 Postman 会自动将配置转换为身份验证标头,该标头将随您的请求一起发送。

【讨论】:

以上是关于HTTP 基本身份验证 - 预期的 Web 浏览器体验是啥?的主要内容,如果未能解决你的问题,请参考以下文章

注销 Web 表单身份验证不会删除服务器上的身份验证

基本身份验证错误凭据的预期行为

支持基本、匿名和 Windows 身份验证的 Web 服务/API

WCF .net 4.0 HTTP 基本身份验证

android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”

Spring 2 Web Security 不同的身份验证未按预期工作