我已经在嵌入式设备上设置了 lighttpd,并配置了模块,lighttpd.conf
当从 PC 上的 Chrome 或 Firefox 访问网页时,系统会要求我输入用户名和密码,输入用户名和密码后,页面就会加载。
当我在 iPad 或 iPhone 浏览器上执行相同操作时,我也会出现身份验证对话框,但由于某种原因,它会反复弹出。
使用该mod_accesslog
模块我能够看到,iPad 仍然会在未使用身份验证的情况下发出请求,这会导致HTTP 401
某些请求:
192.168.2.33 192.168.2.247 wwwX [10/Apr/2011:16:01:30 +0200] "GET /[...] HTTP/1.1" 304 0 "http://192.168.2.247/" ...
192.168.2.33 192.168.2.247 wwwX [10/Apr/2011:16:01:30 +0200] "GET /[...] HTTP/1.1" 304 0 "http://192.168.2.247/" ...
192.168.2.33 192.168.2.247 - [10/Apr/2011:16:01:33 +0200] "GET /[...] HTTP/1.1" 401 351 "http://192.168.2.247/" ...
192.168.2.33 192.168.2.247 - [10/Apr/2011:16:01:56 +0200] "GET / HTTP/1.1" 401 351 "-" ...
我也尝试添加mod_access
模块但没有任何改变。
问题出在浏览器、lighttpd
网络服务器或其模块/配置上吗?如何修复?
我的文件的相关部分lighttpd.conf
如下所示:
# mod_auth must be loaded before mod_fastcgi
server.modules = (
"mod_auth",
"mod_cgi",
"mod_fastcgi"
)
mod_auth 配置部分如下所示:
auth.debug = 0
auth.backend = "plain"
auth.backend.plain.userfile = "/tmp/lighttpd-plain.user"
auth.require = (
"/" =>
(
"method" => "digest",
"realm" => "myRealm",
"require" => "valid-user"
)
)
编辑:
我忘记提到的一件事是,网页使用 jQuery 发出 AJAX 请求。请求不会设置username
和password
变量。在所有浏览器上,在用户通过浏览器弹出对话框进行身份验证后,此操作均可顺利运行。
我认为 Safari 上的 AJAX 请求可能是不使用任何凭据的请求,因此会出现 401 等错误。有没有办法让它使用用户在对话框中提供的凭据?
答案1
auth.require = (
"/" =>
(
"method" => "digest",
"realm" => "myRealm",
"require" => "valid-user"
)
)
这是因为您使用的是摘要式身份验证,而某些浏览器不支持该身份验证或存在错误。您应该使用基本方法(不安全)或使用 cookie 实现自己的身份验证。如果您对安全高效的身份验证解决方案感兴趣(内置保护措施,防止暴力攻击和帐户共享),请查看我们的网站:finesec.com