首页 > 解决方案 > NTLM Auth 不提示需要有效用户和 PHP

问题描述

如果找不到有效用户,我想重定向到登录页面而不显示 htaccess 提示

我有一个有效的 htaccess 身份验证

AuthName "My name"
NTLMBasicRealm "DOM"
NTLMAuth on
NegotiateAuth off
NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
NegotiateAuthHelper "/usr/bin/ntlm_auth --helper-protocol=gss-spnego"
NTLMBasicAuthoritative on
AuthType NTLM
AuthType Negotiate
Require valid-user 

ErrorDocument 401 /index.php

只要找到有效用户,它将 Windows 名称设置为 $_SERVER['REMOTE_USER']。如果没有弹出 htaccess 提示,您需要手动取消它才能重定向

如果我删除 Require valid-user,$_SERVER['REMOTE_USER'] 为空。

有没有办法验证用户但如果没有自动找到重定向而不提示?

标签: phpldapapache2ntlm

解决方案


Windows 身份验证的第一步是向浏览器返回 HTTP 401 响应。如果站点受信任,浏览器将自动发送当前用户的凭据。如果不是,浏览器会提示输入凭据。没有办法改变这种行为。

但是您可以稍微重构您的网站。我在另一个答案中描述了如何在后台尝试 Windows 身份验证并回退到表单身份验证。这个答案是特定于 ASP.NET 的,但同样的事情也可以用 PHP 和 Apache 来完成(尽管我不能确切地告诉你如何去做)。

基本思想是:

  1. 您网站的主要身份验证机制是表单身份验证。
  2. 在您的登录页面上,首先隐藏页面上的所有内容。
  3. 在您的登录页面上,向为 Windows 身份验证配置的 URL 发出 AJAX 请求。
  4. 在服务器端,如果对该 URL 的身份验证成功,您将执行与成功的表单登录相同的操作(通常设置 cookie)。
  5. 在您的登录页面上,如果该 AJAX 请求成功,您将用户转发到他们想要的页面。
  6. 如果 AJAX 请求失败,请在登录页面上显示所有内容,然后他们可以在那里输入用户名和密码。

推荐阅读