使用 LDAP 的 Apache 基于表单的身份验证

Apache Form Based Authentication with LDAP

提问人:Roger McCarrick 提问时间:10/25/2023 更新时间:10/31/2023 访问量:26

问:

我在 Red Hat 9.0 上有 Apache 2.4 (httpd)。 我有使用 ldap 的基本身份验证。它给出了要求输入用户名和密码的弹出框。所以现在我想改变它,以便我可以呈现一个自定义表单。

这就是我目前所拥有的。

<Directory /var/www/html/private>
    AuthType Basic
    AuthName "Login"
    AuthBasicAuthoritative off
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://DC:389/OU=Users,dc=x,dc=com?sAMAccountName?sub?(objectClass=*)"
    Require valid-user
    AuthLDAPBindDN username
    AuthLDAPBindPassword pAsSwOrD
</Directory>

尝试跟随

https://blog.sensecodons.com/2023/01/use-custom-login-page-when-using-apache.html

这就是我试图添加的内容

<Directory "/do-login.html">
    SetHandler form-login-handler
    AuthFormLoginRequiredLocation "login.html"
    AuthFormLoginSuccessLocation "/admin/index.html"
    AuthFormProvider ldap
    AuthUserFile  /dev/null
    AuthType form
    AuthName "Admin"
    Session On
    SessionCookieName session path=/
</Directory>

我将第一个指令中的 AuthType 更改为“Form”

我有一个表格:

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

这对我不起作用,它不断将我送回登录名 .html 。

do-login.html应该是什么样子的?

HTML Apache LDAP

评论


答:

0赞 Roger McCarrick 10/30/2023 #1

我让它工作了。我有 2 个指令,我必须将所有 ldap 内容添加到第二个指令中,包括 URL、名称和密码

<Directory /var/www/html/private>
    AuthType Form
    AuthName "Login"
    AuthFormProvider ldap
    AuthFormLoginRequiredLocation "/login.shtml"
    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"
    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>

这对我现在很有效。我的登录表单用 HTML 和 CSS 包装。我使用此处找到的一些代码创建了一个不错的登录表单:

https://w3codepen.com/html-css-login-form-page/

对于错误的凭据,它会加载 badlogin.shtml,这是相同的形式,并以红色字体添加“错误的用户名或密码”。

顺便说一下,do-login.html只是一个空白页。您甚至根本不需要拥有该页面。我只是把它留作一个空白的html文件。

使用非基于表单的 ldap 登录,用户只是得到了那个弹出框,他们以错误的格式输入了他们的信条。有了这个表单,我能够自定义外观,使其看起来更加用户友好,并给出所需凭证格式的说明。

希望这对某人有所帮助。

更新 - 2023年10月30日 我找到了这个:

https://stackoverflow.com/questions/43287063/redirect-to-previous-page-after-login-from-authformloginlocation-apache2-config/44718693#44718693

我正准备发布这个问题,

我的网站有一个公共和私人部分。下拉菜单中有指向私人部分的链接。 选择专用链接后,系统会将您定向到登录页面。登录页面将您定向到 AuthFormLoginSuccessLocation 而不是从下拉列表中选择的私有页面。这可能吗?像这样: AuthFormLoginSuccessLocation =“已选择的页面”

就像上面一样为我做这件事。因此,我几乎感觉到我基于表单的Apache登录现在已经完成。