基于 Apache 表单的登录捕获错误凭据

问题描述 投票:0回答:1

我在 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

只是尝试考虑用户第一次没有获得正确信用的情况。

提前致谢

html apache authentication request-uri setenvif
1个回答
0
投票

我几周前解决了这个问题,对于任何感兴趣的人,我只是想发布我是如何做到的。

我有原始的

<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

这对我来说效果很好。如果有人能让新指令带我到最初请求的页面,那将非常感激。

© www.soinside.com 2019 - 2024. All rights reserved.