Zammad: HTTP 401响应导致基本身份验证出现问题

创建于 2020-03-24  ·  12评论  ·  资料来源: zammad/zammad

资讯:

  • 使用的Zammad版本:3.2.0
  • 安装方法(源,包,..):在nginx rproxy之后,使用Ruby 2.5.5的源。
  • 操作系统:Ubuntu 18.04.4 LTS(bionic)
  • 数据库+版本:postgres 9.5.21
  • Elasticsearch版本:5.6.16
  • 浏览器+版本:Google Chrome 80.0.3987.132

预期行为:

Zammad与基本身份验证层平滑集成。 因此,永远不会使用状态代码“ HTTP 401未经授权”。 作为替代,状态码403将是适当的替代。

实际行为:

总体而言,与基本身份验证结合使用时,Zammad的问题并不多。 但是在少数情况下,请求将以状态码401应答,并且当前用户被迫重新输入其基本身份验证凭据。

可以轻松地在代码库中搜索状态401(或unauthorized ):
https://github.com/zammad/zammad/search?l=Ruby&q=%3Aunauthorized

重现行为的步骤:

  • 设置Zammad实例并将其置于基本身份验证之后

然后

  • 尝试使用错误的凭据登录
  • 该应用程序呈现一个状态代码为401的页面,并强制您重新输入基本身份验证凭据

或者

  • 创建分配给人1可以访问的组的票证
  • 使用者1与该票证互动
  • 将该票移至其他人1无法访问的组
  • 第1个人在其Zammad概述上仍会看到上面的票证有401请求,这将使他退出基本身份验证

是的,我确定这是一个错误,没有功能要求或一般性问题。

API bug verified

最有用的评论

大家好! 感谢您提供宝贵的信息和说明。 我阅读了RFC,但对401和403之间的区别仍然有些困惑。但是,我在StackOverflow上找到了很好的解释。 引用:

401未经授权(HTTP身份验证错误的状态代码)存在问题。 就是这样:它用于身份验证,而不是授权。

这就是重点。 Zammad使用401来处理authorization错误。 从技术上讲这是错误的,因此是错误。 我将重新讨论这个问题。

但是,我们需要检查影响。 由于所有实现和API使用者,我认为这是一个重大变化。
我当前的计划是使用Zammad 3.4软弃用401 authorization ,使用3.5(或3.6)硬弃用它,然后切换到403。
我们需要在内部进行进一步讨论。

对这个人有进一步的想法吗?

所有12条评论

请更新您的第一篇文章,以保留您的确切安装信息-“ any”在这一点上并不适合-抱歉。 :)

另外,请务必提供完整的网络服务器配置(并让我们知道您使用的是哪个服务器)。 现在,它闻起来有点像技术问题,但我想完全确定一下。 但是,为此,我需要一切。 ;)

谢谢。

你好,我们又见面了,
我更新了问题描述-最初缺少该描述!
最好的

感谢更新。 您的网络服务器的配置是我们的默认配置,由基本身份验证扩展吗? 您介意也提供该vhost配置吗? 只是为了确保我没有错过任何东西。

谢谢!

是的,它基本上只是Zammad默认配置+基本身份验证。 这是vhost配置:

auth_basic 'Restricted: general basic auth';
auth_basic_user_file /etc/.htpasswd.d/zammad;
location /ws {
    proxy_pass  http://zammad_ws;
    proxy_redirect  off;
    proxy_hide_header X-Powered-By;
    proxy_set_header  Host              $host;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-Host  $host;
    proxy_set_header  X-Forwarded-Port  443;
    proxy_set_header CLIENT_IP $remote_addr;
    proxy_read_timeout 86400;
    proxy_http_version 1.1;
    proxy_set_header  Upgrade           $http_upgrade;
    proxy_set_header  Connection        "upgrade";
    proxy_max_temp_file_size  0;
    error_page 502 503 504 =503 @fallback;
}
location / { 
    try_files $uri @proxy;
}
location <strong i="6">@proxy</strong> { 
    proxy_pass  http://zammad;
    proxy_redirect  off;
    proxy_hide_header X-Powered-By;
    proxy_set_header  Host              $host;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-Host  $host;
    proxy_set_header  X-Forwarded-Port  $server_port;
    proxy_http_version 1.1;
    proxy_set_header  Upgrade           $http_upgrade;
    proxy_set_header  Connection        "upgrade";
    proxy_max_temp_file_size  0;
    proxy_set_header CLIENT_IP $remote_addr;
    error_page 502 503 504 =503 @fallback;
}

我们再次调查了这一点。
我们的猜测(如Michael所写)将不是返回HTTP 401(这使浏览器认为给定的基本身份验证凭据不正确),而是返回被禁止的HTTP 403。

如果我没看错的话,那就意味着

app / controllers / application_controller / handles_errors.rb#L39
respond_to_exception(e, :unauthorized)

应该替换为
respond_to_exception(e, :forbidden)

RFC表示浏览器的行为应有所不同(https://tools.ietf.org/html/rfc7231#section-6.5.3):“如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。客户端应不会自动使用相同的凭据重复该请求。”

不过,上周我们在另一个项目中遇到了同样的问题,并且有403个作品。
如果您看不到其他问题,请返回403,我们可以发出PR。

最好的

很抱歉花了这么长时间。
请注意,这不是Zammad相关问题(基于应用程序),而是nginx上的“后端问题”。

基本身份验证的身份验证请求不会在应用程序时到达Zammad,但已经结束(并由您的Nginx或您要使用的任何其他Web服务器检查)。

因此,我认为更改源代码根本无法解决您的问题。
从技术上讲,根据我的判断,未经授权的401是正确的(即使我了解您想要403)。

也可以看看:
https://serverfault.com/questions/616770/nginx-auth-basic-401-htpasswd

顺便一提:
为了仔细检查,我完全注释掉了Zammad代理部分,以确保Zammad的后端无法回复。 401的结果相同,因此是nginx的错误。 :)

结束操作不是一个错误,而是一个技术问题。

@MrGeneration
感谢您查看这个。

虽然我了解到Zammad应用程序似乎无法解决此问题,但我仍然认为它是由它引起的(而不是Ngnix)。 我将尝试解释原因:

假设我们将ngnix配置为_not_以使用基本身份验证。 在这种情况下,我们俩都同意Zammad应用程序(在ngnix的“后面”)可以正常工作。

现在,我们通过将上述配置添加到我们的ngnix中来启用基本身份验证。 请注意,即使到现在,几乎所有内容仍能按预期工作-包括身份验证(基本登录和Zammad登录)以及Zammad应用程序本身。

我尝试早些时候描述的问题有时是稍后(由Zammad!)引起的,当应用程序呈现状态代码为401的页面时。在这种情况下,启用基本身份验证的_any webserver_被强制注销。

我同意在这种情况下从语义上讲401听起来很“正确”。 从技术上讲,它会导致基本身份验证不可避免的问题,应将其替换为403。
请重新打开此问题,因为它可能还会影响许多用户的Zammad应用程序的用户体验。

@thorsteneckel您对此有何看法?

大家好! 感谢您提供宝贵的信息和说明。 我阅读了RFC,但对401和403之间的区别仍然有些困惑。但是,我在StackOverflow上找到了很好的解释。 引用:

401未经授权(HTTP身份验证错误的状态代码)存在问题。 就是这样:它用于身份验证,而不是授权。

这就是重点。 Zammad使用401来处理authorization错误。 从技术上讲这是错误的,因此是错误。 我将重新讨论这个问题。

但是,我们需要检查影响。 由于所有实现和API使用者,我认为这是一个重大变化。
我当前的计划是使用Zammad 3.4软弃用401 authorization ,使用3.5(或3.6)硬弃用它,然后切换到403。
我们需要在内部进行进一步讨论。

对这个人有进一步的想法吗?

那些是好消息! 听起来不错。

为了使您保持循环:我们将在即将发布的4.0版本中实现此功能。

出于内部实施目的: https :

已通过上面的提交修复。 我们抓住了机会,改进了一些401错误消息,但基本上我们唯一更改的是将非身份验证错误更改为403 Forbidden

您可以在大约30分钟后使用最新的develop软件包进行测试。 请注意,这是一个正在运行的分支,并且不稳定。 因此,请确保进行备份,并预见最坏的情况:)期待听到您的反馈!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

julenl picture julenl  ·  3评论

minions1291 picture minions1291  ·  3评论

infestdead picture infestdead  ·  3评论

strey picture strey  ·  3评论

sthag picture sthag  ·  3评论