首页 > 解决方案 > Nginx -> Apache 2 认证 -> 返回 Nginix

问题描述

我们有一个 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

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

标签: authenticationnginxapache2kerberos

解决方案


对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/ location 发出请求时,系统将创建对/auth location 的子请求。现在我们需要创建内部/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指令的更多信息。


推荐阅读