【问题标题】:Nginx -> Apache 2 authentication -> return to NginixNginx -> Apache2 认证 -> 返回 Nginx
【发布时间】:2021-12-23 06:46:20
【问题描述】:

我们有一个 nginx 和一个 apache2 服务器。

Apache2 配置为管理 Kerberos (Active Directory) 身份验证。

我们有一个由 nginx 管理的网站,有一个保留区域。

我会知道这是否可能:

  1. 用户访问由 nginx 管理的主站点

  2. 从主站点,有一个映射到 apache2 的“/login”链接:

   location /login/ {
       proxy_pass http://apache2server/testlogin;
   }
  1. 登录成功后,apache2 配置为转到另一个 nginx 网页,也使用 proxypass:
        ProxyPass /testlogin http://nginxserver/logindone.php
        ProxyPassReverse /testlogin http://nginxserver/logindone.php

我想知道这是否是解决问题的正确方法。

【问题讨论】:

  • 您使用什么 https 模块进行 Kerberos 身份验证?配置是什么样的?您真的只想将用户代理/转发到另一个站点,还是需要使用活动会话并保留它?

标签: authentication nginx apache2 kerberos


【解决方案1】:

NGiNX 网站实施外部身份验证的最佳方式是使用 auth_request 指令。

基本上,您可以保护对任何外部 Web 服务器执行子请求的任何请求。子请求必须返回 HTTP 代码 2XX 以允许继续访问内容,并且返回的任何其他 HTTP 代码都将拒绝访问。

要做到这一点,请确保您已NGiNX 启用了auth_request(使用--with-http_auth_request_module 编译)。要检查这一点,请在 shell 中使用以下命令:

nginx -V 2>&1 | grep "http_auth_request_module"

auth_request 指令添加到您要保护的位置,指定授权子请求将被转发到的内部位置,使用:

location /system/ {
    auth_request /auth;
    #...
}

因此,当向 /system/ 位置发出请求时,系统将创建对 /auth 位置的子请求。现在我们需要创建内部 /auth 位置。我们可以使用下面的例子:

location = /auth {
    internal;
    proxy_pass http://my.app.webserver/auth_endpoint;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    #...
}

在这里,我们创建了 /auth 内部位置。我们使用internal 指令来禁用外部NGiNX 访问(对/auth 的任何外部请求都不会被该位置处理)。此外,我们删除了请求正文内容并将请求长度设置为零,从而删除了所有原始请求变量。我们向 http://my.app.webserver/auth_endpoint 发出子请求,传递所有请求的 cookie,因此您的后端应用程序可以确定用户是否具有访问权限。

如果您需要知道原始请求的 URI,您可以在子请求添加时将其添加到额外的 HTTP 标头中:

proxy_set_header        X-Original-URI $request_uri;

您可以了解更多关于 NGiNX auth_request 指令 here 的信息。

【讨论】:

  • 有趣。外部认证能否将登录用户的用户名返回给NGINX?在我的 apache2 配置中,我使用 RequestHeader set Remote-User expr=%{REMOTE_USER} 传递用户名
  • 我有问题。当我实施您的解决方案时,从 Nginx 到 Apache2,最后一个没有显示授权请求窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2016-07-30
  • 2023-03-31
相关资源
最近更新 更多