使用HTTP基本身份验证时将用户注销

时间:2011-06-08 11:18:48

标签: logout http-basic-authentication www-authenticate

我希望用户能够通过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'); }
});

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 = "basic " + Convert.ToBase64String(enc);

        if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase))
        {
            return Content("You are logged out.");
        }
    }

    // return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header
    this.Response.StatusCode = 401; 
    this.Response.StatusDescription = "Unauthorized";
    this.Response.AppendHeader("WWW-Authenticate", "basic realm=\"My Realm\""); 

    return Content("Force AJAX component to sent header");
}

4)现在,浏览器已接受并缓存随机字符串凭据。当他们访问另一个页面时,它会尝试使用它们,失败,然后提示输入正确的页面。

请注意,我的代码示例使用的是jQuery和ASP.Net MVC,但任何技术堆栈都应该可以实现相同的功能。

在IE6及以上版本中还有另一种方法:

document.execCommand("ClearAuthenticationCache");

但是,这会清除所有身份验证 - 他们会退出我的网站,并且他们也会退出电子邮件。那就好了。

有没有更好的方法呢?

我已经看过other questions,但他们已经2岁了 - 现在IE9,FX4,Chrome等有更好的方法吗?

如果没有更好的方法可以做到这一点,可以依靠这个淤泥吗?有没有办法让它更健壮?

1 个答案:

答案 0 :(得分:2)

短的灵气是:
没有可靠的程序来实现&#34;注销&#34;运用 给出当前基本身份验证实现的HTTP基本或摘要式身份验证。

此类身份验证的工作原理是让客户端添加授权标头 请求。
如果对于某个资源,服务器不满意所提供的凭证(例如,如果没有),则它将以a响应 &#34; 401未经授权&#34;状态代码和请求身份验证。为此,它将提供带有响应的 WWW-Authenticate 标头。

客户端无需等待服务器请求身份验证。 它可能只是根据某些本地提供授权标头 假设(例如上次成功尝试的缓存信息)。

虽然你概述了&#34;清算&#34;认证信息很有可能与广泛的客户(即广泛的浏览器)合作, 绝对不能保证其他客户可能更聪明&#34;和 只需区分您的&#34;注销&#34;页面和目标网站的任何其他页面。

你会发现类似的问题&#34;使用基于客户端证书的身份验证。 只要客户没有明确的支持,你就可能在失地的情况下进行战斗。

所以,如果&#34;注销&#34;是一个问题,转移到任何基于会话的身份验证。

如果您可以在服务器端访问身份验证的实现,那么您可能能够实现一项功能,该功能将忽略使用授权标头提供的身份验证信息(如果仍然与当前显示的内容相同) &#34;会话)根据您的应用程序级代码的请求(或提供一些&#34; timout&#34;之后将重新请求任何凭据),以便客户端将要求用户提供&#34;新&#34;凭证(执行新登录)。