Apache から nginx への認証ヘッダーの転送に関する奇妙な問題 - 続行するには、リクエスト内に空でないヘッダー (se_custid/ein) が見つかりません

Apache から nginx への認証ヘッダーの転送に関する奇妙な問題 - 続行するには、リクエスト内に空でないヘッダー (se_custid/ein) が見つかりません

以下に説明するセットアップでは、Apache は必要なヘッダーを nginx に転送できないか、または初期リクエストを転送するときに nginx が完全な URL ではなく相対パスのみを転送しているように見えます。

ここでの考え方は、nginx でホストされているアプリケーションへの要求が Azure ADFS によって認証されるようにすることです。これが機能するために、Apache はすべての認証要求に対してプロキシの役割を果たします。Apache は mod_auth_openidc を使用して、認証されていない要求を Azure ADFS に転送します。以下を参照してください。

Nginx -> Apache:6000 -> Azure ADFS -> Apache:6000 -> Nginx

ユーザーは Azure ADFS によって正しく認証され、Nginx:80 にリダイレクトされますが、ブラウザー (アプリが原因で) に「続行するには、空でないヘッダー (se_custid/ein) が見つかりません」という奇妙なエラーが表示されます。

Apache ログにはさらに 2 つのエラーがあります:

[auth_openidc:error] [pid 26485] [client SERVERIP:35888] oidc_clean_expired_state_cookies: 状態が期限切れです

nginx に特定のエラーは記録されません。

ここでの質問は、認証後のユーザーがアプリを正しく使用できるように、正しいヘッダーを Apache から nginx に転送する方法、または以下の設定で十分なのか、それともさらに設定が必要なのかということです。

Apache 設定部分

<Location /ourapp>
   AuthType openid-connect
   Require valid-user
</Location>

LoadModule auth_openidc_module modules/mod_auth_openidc.so
OIDCProviderMetadataURL https://login.microsoftonline.com/XXXX_XXX-xxx-XXXXXX/v2.0/.well-known/openid-configuration
OIDCClientID XXXXXXXXXXXXXXX
OIDCClientSecret XXXXXXXXXX
OIDCRedirectURI https://forever-authcheck.tire1network.com:6000/ourapp 
OIDCCryptoPassphrase XXXXXXXXXXXX
OIDCScope "openid email profile"
#OIDCRemoteUserClaim email
OIDCProviderAuthorizationEndpoint https://login.microsoftonline.com/XXXX_XXX-xxx-XXXXXX/oauth2/v2.0/authorize
OIDCProviderTokenEndpoint https://login.microsoftonline.com/XXXX_XXX-xxx-XXXXXX/oauth2/v2.0/token
#OIDCPKCEMethod S256

OIDCPassIDTokenAs claims
OIDCCookiePath /
OIDCCookieDomain forever-authcheck.tire1network.com
OIDCCookie APP-OIDC-SESSION
OIDCCookieHTTPOnly On
OIDCSessionInactivityTimeout 600
OIDCSessionMaxDuration 36006

<VirtualHost *:6000>

    ProxyPreserveHost On
    ErrorLog  /var/log/httpd/voidcerror.log
    LogLevel debug
    ServerName forever-authcheck.tire1network.com

    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header always set Access-Control-Max-Age "1000"
    Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
    
    ProxyPreserveHost On
    Header set ein %{OIDC_CLAIM_EIN}e
    ProxyPass /ourapp/ forever-authcheck.tire1network.com/in/
    ProxyPassReverse /ourapp/ forever-authcheck.tire1network.com/in/
    ProxyPreserveHost On
    ServerName  forever-authcheck.tire1network.com
    
    SSLEngine on
    SSLCertificateFile "/etc/pki/outcert/Certificate.pem"
    SSLCertificateKeyFile "/etc/pki/outcert/CertificateKey.pem"
    SSLCertificateChainFile "/etc/pki/outcert/CertificateChain.p12"
</VirtualHost>



nginx 設定部分

nginx:80


location /ourapp/ {
  proxy_ssl_server_name on;
  proxy_pass https://forever-authcheck.tire1network.com:6000;
  proxy_set_header se-journey "direct";
  proxy_set_header  Host $host;
  proxy_set_header  X-Real-IP $remote_addr;
  proxy_set_header  X-Forwarded-For $remote_addr;
  proxy_set_header  X-Forwarded-Host $remote_addr;
  proxy_redirect default;
  

  proxy_ssl_certificate     /etc/pki/outcert/Certificate.pem;
  proxy_ssl_certificate_key /etc/pki/outcert/CertificateKey.pem;
  proxy_ssl_verify       off;
}









答え1

さて、理解を深めるために少しトライし、さらにログを掘り下げるために別の一時セットアップを展開しました。

現在の理解は次のとおりです。ユーザーリクエスト -> Nginx:443/ourapp -> Apache:6000-> Azure ADFS ->Azure は URL をブラウザーに返します ->ブラウザは返されたURLをリクエストします

ログをよく見ると何が起こっているのかが明らかになりました。さらに、このログはそれを理解するのに役立ちました。もっと

ngnixを調整して正しいポートと正しいホストで正しいヘッダーを送信した後、

proxy_set_header X-Forwarded-Port "443";

proxy_set_header X-Forwarded-Host "forever-authcheck.tire1network.com";

その結果、Apache と mod_auth_openidc によって、original_url に適切な Cookie 設定が行われました。

リダイレクトが正しく機能するようになり、クレームが NGINX とアプリに到達します。

関連情報