我在 Red Hat 9.0 上有 Apache 2.4 (httpd)。我使用 ldap 和自定义登录表单进行基本身份验证。
我的httpd.conf有以下内容
<Directory /var/www/html/private>
AuthType Form
AuthName "Login"
AuthFormProvider ldap
AuthFormLoginRequiredLocation "/login.shtml?req=%{REQUEST_URI}"
AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
AuthLDAPBindDN username
AuthLDAPBindPassword pAsSwOrD
Session On
SessionCookieName session path=/
</Directory>
<location "/do-login.html">
SetHandler form-login-handler
AuthFormLoginRequiredLocation "badlogin.shtml"
SetEnvIf Referer ^.*req=(.*)&?$ req=$1
AuthFormLoginSuccessLocation %{ENV:req}
AuthFormProvider ldap
AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
AuthLDAPBindDN username
AuthLDAPBindPassword pAsSwOrD
AuthType form
AuthName "Login"
Session On
SessionCookieName session path=/
</location>
我在login.html中有一个基本表单
<form method="POST" action="/do-login.html">
Username: <input type="text" name="httpd_username" value="" />
Password: <input type="password" name="httpd_password" value="" />
<input type="submit" name="login" value="Login" />
</form>
<directory>
指令的作用是在您通过login.html页面登录后将您发送到您最初请求的页面。
如果您的凭据错误,
<location>
指令会将您发送到 badlogin.html,它与 login.html 基本相同,但它有红色字体的“BAD CREDS,Try Again”。
但是,如果您在这里获得正确的凭据,则需要您执行 do-login.html ... 302 Found .. 说文档已移动
<here>
.. 其中“此处”是返回自身的超链接。单击该链接会显示消息“不允许使用方法,此 URL 不允许使用请求的方法 GET。”
do-login 已成为这里的推荐人。
我怎样才能让 badlogin.html 将我发送到合法页面?我猜最初的引荐来源网址已不为人知,因此 /private/index.shtml 将是一个足够好的成功位置。
在我开始使用
"?req=%{REQUEST_URI}"
和"SetEnvIf Referer"
之前我只是使用
AuthFormLoginRequiredLocation "/login.shtml"
和
AuthFormLoginSuccessLocation "/private/index.shtml"
所以无论你最初选择哪个页面,成功登录后你总是会到达“/private/index.shtml”。我不喜欢这样。 如果您选择 /private/pageA.shtml 或 /private/pageB.shtml,那么您总是会到达 /private/index.shtml。使用上述指令,如果您选择/private/pageB.shtml,则在您登录后会将您带到/private/pageB.shtml。但如果您在信用中犯了错误,并在下次尝试时将其改正,则情况并非如此。
我尝试过但没有成功:
AuthFormLoginRequiredLocation "/badlogin.shtml?req=%{REQUEST_URI}"
也许有一种方法可以有条件地设置
AuthFormLoginSuccessLocation
?
只是尝试考虑用户第一次没有获得正确信用的情况。
提前致谢
我几周前解决了这个问题,对于任何感兴趣的人,我只是想发布我是如何做到的。
我有原始的
<directory>
指令,它将您发送到 login.html
页面进行身份验证,最初请求的页面附加为 %{REQUEST_URI}
<Directory /var/www/html/private>
AuthType Form
AuthName "Login"
AuthFormProvider ldap
AuthFormLoginRequiredLocation "/login.shtml?req=%{REQUEST_URI}"
AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
AuthLDAPBindDN username
AuthLDAPBindPassword pAsSwOrD
Session On
SessionCookieName session path=/
</Directory>
然后我就有了原始的
<location>
指令,用于处理 login.html 表单。如果身份验证正确,您将转到您最初请求的页面,如果没有,您将转到badlogin.html
。
<location "/do-login.html">
SetHandler form-login-handler
AuthFormLoginRequiredLocation "badlogin.shtml"
SetEnvIf Referer ^.*req=(.*)&?$ req=$1
AuthFormLoginSuccessLocation %{ENV:req}
AuthFormProvider ldap
AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
AuthLDAPBindDN username
AuthLDAPBindPassword pAsSwOrD
AuthType form
AuthName "Login"
Session On
SessionCookieName session path=/
</location>
该指令处理
do-login.html
,这不是一个真实的页面。它是login.html 表单中的action
。
<form method="POST" action="/do-login.html">
然后我添加了一个新的
<location>
指令。
<location "/next-login.html">
SetHandler form-login-handler
AuthFormLoginRequiredLocation "badlogin.shtml"
AuthFormLoginSuccessLocation "/private/index.html"
AuthFormProvider ldap
AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
AuthLDAPBindDN username
AuthLDAPBindPassword pAsSwOrD
AuthType form
AuthName "Login"
Session On
SessionCookieName session path=/
</location>
以前,我的 badlogin.html 与 login.html 相同,但带有红色字体的“BAD CREDS,再试一次”。现在仍然如此。 但我改变了形式中的
action
:
<form method="POST" action="/next-login.html">
这个新指令处理
next-login.html
。再次强调,这不是一个真实的页面,它是 badlogin.html 中表单中的 action
。
如果身份验证不正确,您将返回 badlogin.html。如果正确,则最初请求的页面现在已丢失,因此我让您转到硬编码页面,在本例中为 /private/index.html
这对我来说效果很好。如果有人能让新指令带我到最初请求的页面,那将非常感激。