描述: | 表格认证 |
---|---|
状态: | 基础 |
模块标识符: | auth_form_module |
源文件: | mod_auth_form.c |
兼容性: | 在Apache 2.3及更高版本中可用 |
表单身份验证取决于这些mod_session
模块,并且这些模块使用HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或者向客户端公开潜在的私人信息。在服务器上启用会话功能之前,请确保已考虑到相关风险。
该模块允许使用HTML登录表单来通过在给定提供者中查找用户来限制访问。HTML表单比其他表单需要更多的配置,但是HTML登录表单可以为最终用户提供更友好的体验。
由提供HTTP基本认证,由提供
mod_auth_basic
HTTP摘要认证mod_auth_digest
。该模块应与至少一个认证模块(例如)mod_authn_file
和一个授权模块(例如)组合mod_authz_user
。
成功验证用户身份后,该用户的登录详细信息将存储在由提供的会话中mod_session
。
为了保护与特定的URL mod_auth_form
,你需要决定你将存储你的会话,你需要决定你会用什么方法来验证。在这个简单的示例中,登录详细信息将基于存储在会话中
mod_session_cookie
,并使用尝试对文件进行身份验证mod_authn_file
。如果认证失败,则用户将被重定向到表单登录页面。
<Location "/admin"> AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName "/admin" AuthFormLoginRequiredLocation "http://example.com/login.html" Session On SessionCookieName session path=/ Require valid-user </Location>
设置为值形式时,伪指令AuthType
将启用mod_auth_form
身份验证。指令和
指定应根据所选文件检查用户名和密码。AuthFormProvider
AuthUserFile
指令Session
和
SessionCookieName
会话存储在浏览器的HTTP cookie中。有关配置会话的不同选项的更多信息,请阅读的文档
mod_session
。
您可以选择添加
SessionCryptoPassphrase
来创建加密的会话Cookie。这需要mod_session_crypto
加载附加模块。
在上面的简单示例中,URL已受到的保护
mod_auth_form
,但是尚未为用户提供输入其用户名和密码的机会。这样做的选项包括为此目的提供专用的独立登录页面,或内联提供登录页面。
该登录表单可以作为独立页面托管,也可以在同一页面上内联提供。
当将登录配置为独立页面时,不成功的身份验证尝试应使用AuthFormLoginRequiredLocation
指令重定向到网站为此目的而创建的登录表单。通常,此登录页面将包含HTML表单,要求用户提供其使用名和密码。
<form method="POST" action="/dologin.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>
进行实际登录的部分由form-login-handler处理。表单的操作应指向此处理程序,该处理程序在Apache httpd中进行如下配置:
<Location "/dologin.html"> SetHandler form-login-handler AuthFormLoginRequiredLocation "http://example.com/login.html" AuthFormLoginSuccessLocation "http://example.com/admin/index.html" AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName /admin Session On SessionCookieName session path=/ </Location>
AuthFormLoginRequiredLocation
指令指定的URL
通常将指向一个页面,向用户解释其登录尝试失败,因此应再次尝试。该AuthFormLoginSuccessLocation
指令规定了用户应成功登录后重定向的URL。
或者,可以将成功重定向用户的URL嵌入在登录表单中,如下例所示。结果,可以将相同的表单登录处理程序重新用于网站的不同区域。
<form method="POST" action="/dologin.html"> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> <input type="hidden" name="httpd_location" value="http://example.com/success.html" /> </form>
在某些情况下,存在使用内联登录配置的登录表单可能会多次提交的风险,从而向在其下运行的应用程序显示登录凭据。管理员必须确保适当保护基础应用程序,以防止滥用。如有疑问,请使用独立登录配置。
作为网站专用登录页面的替代方法,可以配置mod_auth_form
为内联身份验证用户,而无需重定向到另一个页面。这允许在登录尝试期间保留当前页面的状态。在有时间限制的会话生效并且会话在用户请求中间超时的情况下,这很有用。可以在适当位置重新认证用户,然后他们可以从中断的地方继续进行。
如果未经身份验证的用户尝试访问mod_auth_form
未由AuthFormLoginRequiredLocation
伪指令配置的受保护页面
,则
HTTP_UNAUTHORIZED状态代码会返回到浏览器,以指示该用户无权查看该页面。
要配置内联身份验证,管理员将使用包含登录表单的自定义错误文档覆盖HTTP_UNAUTHORIZED状态代码返回的错误文档,如下所示:
AuthFormProvider file ErrorDocument 401 "/login.shtml" AuthUserFile "conf/passwd" AuthType form AuthName realm AuthFormLoginRequiredLocation "http://example.com/login.html" Session On SessionCookieName session path=/
错误文档页面应包含具有空action属性的登录表单,如以下示例所示。这样可以将表单提交到原始受保护的URL,而页面不必知道该URL是什么。
<form method="POST" action=""> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> </form>
最终用户填写了登录详细信息后,该表单将向原始受密码保护的URL发出HTTP POST请求。
mod_auth_form
会拦截此POST请求,如果在用户名和密码的HTML字段中找到了HTML字段,则该用户将登录,原始的受密码保护的URL将作为GET请求返回给用户。
上述内联登录技术的局限性在于,如果HTML表单POST导致请求了身份验证或重新身份验证,则浏览器发布的原始表单的内容将丢失。根据网站的功能,这可能给最终用户带来极大的不便。
mod_auth_form
通过允许将原始请求的方法和主体嵌入登录表单来解决此问题。如果身份验证成功,则Apache httpd将重试原始方法和主体,并保留原始请求的状态。
要启用正文保存,请按照以下示例在登录表单中添加三个其他字段。
<form method="POST" action=""> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" />
<input type="hidden" name="httpd_method" value="POST" /> <input type="hidden" name="httpd_mimetype" value="application/x-www-form-urlencoded" /> <input type="hidden" name="httpd_body" value="name1=value1&name2=value2" />
</form>
如何将原始请求的方法,模仿类型和主体嵌入登录表单中,这取决于网站中使用的平台和技术。
一种选择是将mod_include
模块与
KeptBodySize
指令一起使用,以及合适的CGI脚本将变量嵌入表格中。
另一种选择是使用CGI脚本或其他动态技术来呈现登录表单。
AuthFormProvider file ErrorDocument 401 "/cgi-bin/login.cgi" ...
要使用户能够注销特定的会话,请配置要由form-logout-handler处理的页面。任何尝试访问此URL的操作都会导致用户名和密码从当前会话中删除,从而有效地注销用户。
通过设置
AuthFormLogoutLocation
指令,可以指定成功注销后将浏览器重定向到的URL。该URL可能会向用户说明他们已经注销,并为用户提供了重新登录的选项。
SetHandler form-logout-handler AuthName realm AuthFormLogoutLocation "http://example.com/loggedout.html" Session On SessionCookieName session path=/
请注意,注销用户并不会删除会话。它只是从会话中删除用户名和密码。如果这导致会话为空,则最终结果将是删除该会话,但这不能保证。如果要保证删除会话,请将SessionMaxAge
伪指令设置
为一个较小的值,例如1(将伪指令设置为零将意味着没有会话期限限制)。
SetHandler form-logout-handler AuthFormLogoutLocation "http://example.com/loggedout.html" Session On SessionMaxAge 1 SessionCookieName session path=/
请注意,表单提交涉及URLEncoding表单数据:在这种情况下,用户名和密码。因此,您应该选择避免在表单提交中使用URL编码的字符的用户名和密码,否则可能会得到意外的结果。
描述: | 设置是否将授权和身份验证传递给较低级别的模块 |
---|---|
句法: | AuthFormAuthoritative On|Off |
默认: | AuthFormAuthoritative On |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_auth_form |
通常,列出的每个授权模块AuthFormProvider
都会尝试验证用户,如果在任何提供程序中都找不到该用户,则将拒绝访问。如果没有用户ID或
与提供的用户ID匹配的规则,则将AuthFormAuthoritative
指令显式设置
为Off
允许将身份验证和授权传递给其他基于非提供商的模块。仅当与未使用
伪指令配置的第三方模块结合使用时,才应该这样做。使用此类模块时,处理顺序在模块的源代码中确定,并且不可配置。mod_auth_form
AuthFormProvider
描述: | 表单域的名称,其中包含尝试成功登录的请求的主体 |
---|---|
句法: | AuthFormBody fieldname |
默认: | AuthFormBody httpd_body |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormBody
指令指定HTML字段的名称,如果存在,它将包含登录成功后要提交的请求的正文。
通过用描述字段填充形式
AuthFormMethod
,
AuthFormMimetype
并且
AuthFormBody
,一个网站可以重试可能已经被登录屏幕中断,或由会话超时的请求。
描述: | 在登录页面上禁用CacheControl无存储头 |
---|---|
句法: | AuthFormDisableNoStore On|Off |
默认: | AuthFormDisableNoStore Off |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormDisableNoStore
标志禁止发送Cache-Control no-store
标头,并在用户尚未登录时返回错误401页面。标头的目的是使ecmascript
应用程序难以尝试重新提交登录表单并显示用户名和密码到后端应用程序。禁用后果自负。
描述: | 伪造基本身份验证标头 |
---|---|
句法: | AuthFormFakeBasicAuth On|Off |
默认: | AuthFormFakeBasicAuth Off |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormFakeBasicAuth
标志确定是否将Basic Authentication
标头添加到请求标头。这可以用于将用户名和密码公开给基础应用程序,而基础应用程序不必知道如何实现登录。
描述: | 成功登录后带有URL重定向到的表单字段的名称 |
---|---|
句法: | AuthFormLocation fieldname |
默认: | AuthFormLocation httpd_location |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormLocation
指令指定HTML字段的名称(如果存在),该字段将包含URL,以将浏览器重定向到登录成功的位置。
描述: | 需要登录后要重定向到的页面的URL |
---|---|
句法: | AuthFormLoginRequiredLocation url |
默认: | none |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用。表达式分析器的使用已在2.4.4中添加。 |
该AuthFormLoginRequiredLocation
指令指定了如果用户无权查看页面则重定向到的URL。该值在发送给客户端之前使用ap_expr解析器进行解析。默认情况下,如果用户无权查看页面,则HTTP响应代码
HTTP_UNAUTHORIZED
将与ErrorDocument
伪指令指定的页面一起返回
。该指令将覆盖此默认值。
如果您有专用的登录页面可将用户重定向到,请使用此伪指令。
描述: | 登录成功后要重定向到的页面的URL |
---|---|
句法: | AuthFormLoginSuccessLocation url |
默认: | none |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用。表达式分析器的使用已在2.4.4中添加。 |
该AuthFormLoginSuccessLocation
指令指定的URL重定向到如果用户已成功登录。该值在发送给客户端之前使用ap_expr解析器进行解析。如果使用该AuthFormLocation
指令定义了包含另一个URL的表单字段,则可以覆盖该指令。
如果您有专用的登录URL,并且尚未将目标页面嵌入登录表单,请使用此伪指令。
描述: | 用户注销后重定向到的URL |
---|---|
句法: | AuthFormLogoutLocation uri |
默认: | none |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用。表达式分析器的使用已在2.4.4中添加。 |
该AuthFormLogoutLocation
指令指定服务器上的网页的URL重定向到如果用户试图注销。该值在发送给客户端之前使用ap_expr解析器进行解析。
当访问由处理程序提供的URI时form-logout-handler
,此指令指定的页面将显示给最终用户。例如:
<Location "/logout"> SetHandler form-logout-handler AuthFormLogoutLocation "http://example.com/loggedout.html" Session on #... </Location>
尝试访问URI / logout /将会导致用户被注销,并显示/loggedout.html页面。确保页面 loginout.html没有受密码保护,否则将不会显示该页面。
描述: | 表单域的名称,其中包含尝试成功登录的请求方法 |
---|---|
句法: | AuthFormMethod fieldname |
默认: | AuthFormMethod httpd_method |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormMethod
指令指定的HTML字段,如果存在,将包含提交应该登录成功请求的方法的名称。
通过用描述字段填充形式
AuthFormMethod
,
AuthFormMimetype
并且
AuthFormBody
,一个网站可以重试可能已经被登录屏幕中断,或由会话超时的请求。
描述: | 表单字段的名称,其中包含尝试成功登录的请求主体的模仿类型 |
---|---|
句法: | AuthFormMimetype fieldname |
默认: | AuthFormMimetype httpd_mimetype |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormMimetype
指令指定的HTML字段构成,其中,如果存在的话,将包含请求的MIME类型提交的名称应该登录成功。
通过用描述字段填充形式
AuthFormMethod
,
AuthFormMimetype
并且
AuthFormBody
,一个网站可以重试可能已经被登录屏幕中断,或由会话超时的请求。
描述: | 带有登录密码的表单字段的名称 |
---|---|
句法: | AuthFormPassword fieldname |
默认: | AuthFormPassword httpd_password |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormPassword
指令指定要使用的HTML字段构成,其中,如果存在的话,将包含密码名登录。
描述: | 设置此位置的身份验证提供程序 |
---|---|
句法: | AuthFormProvider provider-name
[provider-name] ... |
默认: | AuthFormProvider file |
内容: | 目录.htaccess |
覆写: | 验证配置 |
状态: | 基础 |
模块: | mod_auth_form |
该AuthFormProvider
指令设置使用哪个提供程序来认证此位置的用户。默认file
提供程序由mod_authn_file
模块实现。确保服务器中存在所选的提供程序模块。
<Location "/secure"> AuthType form AuthName "private area" AuthFormProvider dbm AuthDBMType SDBM AuthDBMUserFile "/www/etc/dbmpasswd" Require valid-user #... </Location>
供应商通过实施mod_authn_dbm
,
mod_authn_file
,mod_authn_dbd
,
mod_authnz_ldap
和mod_authn_socache
。
描述: | 绕过高流量站点的身份验证检查 |
---|---|
句法: | AuthFormSitePassphrase secret |
默认: | none |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormSitePassphrase
指令指定一个密码,如果存在于用户会话,使阿帕奇的httpd到对于给定的URL旁路认证检查。它可以用于高流量的网站上,以减轻身份验证基础结构带来的负担。
通过将此指令添加到form-login-handler的配置中,可以将密码短语插入用户会话。该表单登录处理程序 本身将始终运行认证检查,无论是否指定了一个密码与否。
如果使用来向用户公开会话
mod_session_cookie
,并且该会话不受的保护
mod_session_crypto
,则密码短语可能会通过字典攻击而暴露给潜在用户。无论如何配置会话,请确保不要在可能暴露私有用户数据或可以进行敏感事务的URL空间中使用此伪指令。使用风险自负。
描述: | 表单的最大大小(以字节为单位),将解析为登录详细信息 |
---|---|
句法: | AuthFormSize size |
默认: | AuthFormSize 8192 |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormSize
指令指定将被解析,找到登录表单的请求主体的最大尺寸。
如果到达的登录请求超过此大小,则整个请求将被HTTP响应代码中止HTTP_REQUEST_TOO_LARGE
。
如果您使用AuthFormMethod
,
AuthFormMimetype
和
描述的字段填充了表单
AuthFormBody
,则可能需要将此字段设置为与KeptBodySize
指令相似的大小。
描述: | 带有登录用户名的表单字段的名称 |
---|---|
句法: | AuthFormUsername fieldname |
默认: | AuthFormUsername httpd_username |
内容: | 目录 |
状态: | 基础 |
模块: | mod_auth_form |
兼容性: | 在Apache HTTP Server 2.3.0和更高版本中可用 |
该AuthFormUsername
指令指定HTML字段的名称,如果存在,则将包含用于登录的用户名。