如果用户使用基本身份验证,是否可以从网站注销用户?
杀戮会话是不够的,因为一旦用户通过身份验证,每个请求都包含登录信息,因此用户下次使用相同的凭据访问站点时会自动登录.
到目前为止,唯一的解决方案是关闭浏览器,但从可用性的角度来看,这是不可接受的.
注销HTTP身份验证保护文件夹的正确方法是什么?
有一些解决方法可以实现这一点,但它们具有潜在的危险性,因为它们可能是错误的,或者在某些情况/浏览器中不起作用.这就是为什么我正在寻找正确和干净的解决方案.
php authentication .htaccess password-protection http-headers
我希望用户能够通过HTTP基本身份验证模式登录.
问题是我还希望他们能够再次注销 - 奇怪的是,浏览器似乎并不支持.
这被认为是一种社交黑客风险 - 用户将其机器解锁并且浏览器打开,而其他人可以轻松地访问该网站.请注意,仅关闭浏览器选项卡不足以重置令牌,因此用户可能很容易错过.
所以我想出了一个解决方法,但这是一个完全的问题:
1)将它们重定向到Logoff页面
2)在该页面上激活一个脚本到ajax加载另一个带有伪凭证的页面:
$j.ajax({
url: '<%:Url.Action("LogOff401", new { id = random })%>',
type: 'POST',
username: '<%:random%>',
password: '<%:random%>',
success: function () { alert('logged off'); }
});
Run Code Online (Sandbox Code Playgroud)
3)应该总是第一次返回401(强制传递新凭据),然后只接受伪凭证:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOff401(string id)
{
// if we've been passed HTTP authorisation
string httpAuth = this.Request.Headers["Authorization"];
if (!string.IsNullOrEmpty(httpAuth) &&
httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
{
// build the string we expect - don't allow regular users to pass
byte[] enc = Encoding.UTF8.GetBytes(id + ':' + id);
string expected …Run Code Online (Sandbox Code Playgroud) 我有一个Firefox和IE的解决方案,但我没有找到任何谷歌Chrome的解决方案.
有没有办法在谷歌浏览器中做到这一点?
我使用以下方法从使用基本HTTP身份验证的HTTP服务器注销.这适用于IE和FireFox.但是对于Chrome,我甚至可以使用错误的用户名和密码来获取html文件.
在Chrome中,流程是,我收到"**********失败***********"错误,然后显示请求的页面(some_server_file.html).
但是在IE/Chrome中,流程是,我得到"**********失败***********"错误,然后登录对话框提示输入凭证.
无论如何,即使第一次请求失败并且凭据错误,Chrome也会发送正确的用户名和密码.
任何人都可以修复Chrome问题吗?
function logout() {
jQuery.ajax({
type: "get",
url: "some_server_file.html",
async: false,
username: "wronguser",
password: "wrongpass",
headers: {"Authorization": "Basic xxx"}
})
.success(function () {
console.log("********** Success ***********");
})
.fail(function () {
console.log("********** Failed ***********");
});
return false;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我尝试了位于http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application的"Simple Acl受控应用程序1和2"教程. HTML.
执行此操作后,我尝试激活BasicAuth而不是FormAuth.
我在我的UsersController中重新实现了login()函数,如下所示:
public function login() {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Not able to login');
}
}
Run Code Online (Sandbox Code Playgroud)
并将我的AppController中的$ components变量更改为以下内容:
public $components = array(
'Acl',
'Auth' => array(
'authorize' => array(
'Actions' => array('actionPath' => 'controllers')
),
'authenticate' => array('Basic')
),
'DebugKit.Toolbar',
'Session'
);
Run Code Online (Sandbox Code Playgroud)
BasicAuth"弹出窗口"按预期显示,但是当我尝试登录时,它会在无限循环中重新启动.除了包含DebugKit之外,我在完成教程后没有做任何改动.
我错过了什么?我希望有人可以帮助我,因为我想在下一个项目中使用CakePHP编码!
更新
AppController的
public function beforeFilter() {
//Configure AuthComponent
$this->Auth->allow('display');
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login'); …Run Code Online (Sandbox Code Playgroud) .htaccess ×2
http ×2
cakephp ×1
cakephp-2.3 ×1
html ×1
http-headers ×1
javascript ×1
jquery ×1
logout ×1
php ×1