Apache2 HTTP 身份验证:不要求提供凭据,立即返回 401

Apache2 HTTP 身份验证:不要求提供凭据,立即返回 401

我有一个 Apache 2.4 网络服务器,它提供一些应该对公众可见的文件,以及其他应该只在身份验证后才可见的文件,我已经使用文件AuthType Basic中的指令实现了这些.htaccess文件。

受限制的文件永远不会被使用浏览器的人访问,而只能由请求它们并在 HTTP 标头中包含身份验证凭据的软件访问。

如果访问网站时没有在标头中直接提供凭据(例如使用浏览器),我希望 Apache401 Unauthorized立即返回状态而不显示身份验证对话框。这可能吗?

答案1

您不能仅通过发送 401 Unauthorised 响应来实现这一点(正如@davidgo 已经指出的那样)。但是,您也不能只发送另一个 4xx 状态;您需要两者。

当从您的软件发送 HTTP 请求标头时,您需要 HTTP 基本身份验证(即潜在的“401 未授权”响应)Authorization,但是当在初始请求(即默认浏览器请求)上未尝试身份验证时,将以 403 Forbidden 进行响应。

在 Apache 2.4 上,您可以使用 Apache 表达式来使这个条件...

# Check if "Authorization: Basic ..." HTTP request header has been sent 
<If "%{HTTP:Authorization} =~ /^Basic\s./">
    AuthType Basic
    AuthName "Private Area"
    AuthUserFile "/home/user/.htpasswds/secret"
    Require valid-user
</If>
<Else>
    # 403 Forbidden all requests that have not sent an "Authorization" header
    Require all denied
</Else>

只要软件在Authorization标头中发送正确的凭据,就应该允许访问。如果您的软件应该发送错误的凭证,则将返回预期的 401 Unauthorized 响应。否则,任何未发送标头的请求Authorization都将只收到 403 Forbidden 且不会提示输入密码。

答案2

我认为这是不可能的。根据https://httpstatuses.com/401必须使用 WWW 身份验证字段发送 401 错误,这可能会提示一个对话框(也许您可以尝试未知的身份验证类型,但我猜这不会可靠地工作)

有大量的 400 系列状态代码(https://httpstatuses.com/) - 为什么不使用不同的呢?403 似乎完美地描述了您的需要。

相关内容