Jenkins/Nginx - 双重提示基本身份验证,为啥?为啥有内部 Jenkins 身份验证?

Posted

技术标签:

【中文标题】Jenkins/Nginx - 双重提示基本身份验证,为啥?为啥有内部 Jenkins 身份验证?【英文标题】:Jenkins/Nginx - Double prompted for basic auth, why? Why is there an internal Jenkins auth?Jenkins/Nginx - 双重提示基本身份验证,为什么?为什么有内部 Jenkins 身份验证? 【发布时间】:2016-06-04 11:04:59 【问题描述】:

下面是我的 Jenkins 配置文件。其中大部分与我在文档中阅读的完全一致。

配置文件:

upstream app_server 
    server 127.0.0.1:8080 fail_timeout=0;


server 
    listen 80;
    listen [::]:80 default ipv6only=on;
    server_name sub.mydomain.net;

location ^~ /jenkins/ 

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) 
        proxy_pass http://app_server;
        break;
    

    auth_basic "[....] Please confirm identity...";
    auth_basic_user_file /etc/nginx/.htpasswd;

当导航到http://sub.mydomain.net/jenkins 时,我会收到提示我的基本身份验证,服务器说:[....] 请确认身份...

这是正确的,但是一旦我输入正确的凭据,我就会再次再次提示进行基本身份验证,但这一次:服务器说:Jenkins

第二个隐藏的 basic_auth 是从哪里来的?!这对我来说没有任何意义。

在第一个提示上点击 CANCEL 然后我正确地收到 401 需要授权 错误。

在第二个基本身份验证上点击 CANCEL“服务器说:Jenkins”)我得到:

HTTP ERROR 401

Problem accessing /jenkins/. Reason:

Invalid password/token for user: _____
Powered by Jetty://

有谁知道可能发生了什么?

【问题讨论】:

【参考方案1】:

通过使用 basic_auth 搜索用作任何其他应用程序的反向代理的 Nginx,找到了我的问题的解决方案。

解决方案是在这里找到的答案: https://serverfault.com/questions/511846/basic-auth-for-a-tomcat-app-jira-with-nginx-as-reverse-proxy

我的 nginx 配置中缺少的行是:

 # Don't forward auth to Tomcat
 proxy_set_header   Authorization "";

默认情况下,在基本身份验证之后,Nginx 似乎还会另外将身份验证标头转发给 Jenkins,这就是导致我的问题的原因。 Jenkins 收到转发的 auth 头,然后认为它也需要授权自己?!

如果我们将反向代理设置为不转发任何授权标头,如上所示,那么一切都会正常运行。 Nginx 将提示 basic_auth 并且在成功认证后我们在转发到我们的反向代理时明确清除(重置?)认证头。

【讨论】:

非常感谢这解决了我的问题。经过数小时的搜索和谷歌搜索...... 拯救了我的一天!谢谢!顺便说一句,对于 apache,它将是 RequestHeader set Authorization ""【参考方案2】:

我也遇到了这个问题,在我的情况下,它是由 jenkins 本身启用安全性引起的,禁用安全性解决了这个问题。

根据他们的文档:

如果您在 Apache 中进行访问控制,请不要在 Jenkins 中启用安全性,因为这两件事会相互干扰。

https://wiki.jenkins-ci.org/display/JENKINS/Apache+frontend+for+security

似乎正在发生的是 nginx 将 auth_basic 响应转发给 jenkins,jenkins 尝试执行 auth_basic 作为响应。我还没有找到令人满意的解决方案。

【讨论】:

感谢您的回复!正如您将在下面看到的那样,我找到了我们问题的解决方案,但我认为您的文档链接实际上可能会证明未来的问题并为洞察力感到高兴。在您的文档链接之前它说,“如果访问控制需求过于简单(例如对所有人隐藏 Jenkins,除了少数人),这种方法是合适的,但如果您开始进行更复杂的设置,它往往会崩溃。 ...” - 我们要做什么?我想让组织中的人仍然可以访问 Jenkins(通过 nginx 基本身份验证),但不要修改它。

以上是关于Jenkins/Nginx - 双重提示基本身份验证,为啥?为啥有内部 Jenkins 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Windows 身份验证仅提示一个用户的凭据

Cookie 与基本身份验证

Apple 开发人员使用双重身份验证注册

双重身份验证机制:SSO 和 DB 凭据

Google 帐户登录错误(双重身份验证)[关闭]

双重 OWIN 身份验证无法协同工作