56

在像这样的 web.config 中使用 Windows 身份验证时如何注销?

<authentication mode="Windows" />

我已经尝试了以下失败。它重定向,但不注销用户。

void logoutButton_Click(object sender, EventArgs e) {
    HttpContext.Current.Session.Clear();
    HttpContext.Current.Session.Abandon();
    ViewState.Clear();
    FormsAuthentication.SignOut();
    Response.Redirect("/");
}

背景资料:

我必须使用 Windows 身份验证,因为我需要使用 Active Directory 模拟身份来访问本地文件。而且我无法使用 Forms 身份验证来模拟,因为它HttpContext.Current.User.Identity不会是WindowsIdentity. 使用表单身份验证进行模拟

4

8 回答 8

40

使用“Windows”身份验证时,任何服务器端注销按钮都不起作用。如果您想要注销按钮或关闭用户的浏览器,则必须使用“表单”身份验证。

于 2009-10-09T19:11:03.257 回答
24

仅适用于 IE 浏览器,如果使用 Windows 身份验证,您可以使用以下 javascript 注销用户。(注意:关闭浏览器不是必需的,但建议用户使用非 IE 浏览器)。

如果用户单击“否”以关闭浏览器,则如果用户尝试访问需要身份验证的站点上的页面,则会提示用户输入用户名/密码。

try {
   document.execCommand("ClearAuthenticationCache");
}
catch (e) { }
window.close();

此代码取自 SharePoint 的 Signout.aspx 页面。

于 2011-04-20T13:58:04.637 回答
14

Windows 身份验证通过传递您的 Windows 身份验证令牌在 IIS 级别工作。由于身份验证发生在 IIS 级别,因此您实际上无法从应用程序代码中注销。但是,这里似乎有您的问题的答案。这是解决的第二个问题,主要涉及使用 Forms Authentication 和 LogonUser Windows api。

于 2009-07-01T05:09:08.007 回答
6

我有一个带有 Windows 身份验证的 SharePoint 应用程序,我需要在 15 分钟后自动注销。我混合了一些代码,结果如下。它可以在 IE 中正常工作。

<script type="text/javascript">
var t;
window.onload = resetTimer;
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;

function logout() {

    try {
        document.execCommand("ClearAuthenticationCache");
        window.location.href = window.location.protocol.replace(/\:/g, '') + "://" + window.location.host + "/_layouts/customlogin14.aspx";
    }
    catch (e) { }

}

function resetTimer() {
    window.clearTimeout(t);
    t = window.setTimeout(logout, 900000);
} 

将这些代码放在您的母版页中,15 分钟空闲时间后,您将看到登录页面。希望这对某人有帮助

于 2013-06-10T19:27:46.913 回答
3

我在 IE 和 Firefox 中都使用 JavaScript,虽然它会让你退出你在 IE 中登录的所有内容。它可以在 Safari 中使用,但 Safari 会发出网络钓鱼警告。在 Opera 中不起作用。

try {
    if (document.all) {
        document.execCommand("ClearAuthenticationCache");
        window.location = "/";
    } else {
        window.location = "http://logout:logout@example.com";
    }
} catch (e) {
    alert("It was not possible to clear your credentials from browser cache. Please, close your browser window to ensure that you are completely logout of system.");
    self.close();
}
于 2011-06-17T16:59:07.857 回答
2

遇到了很多麻烦,下面是有效的代码,希望有人觉得它有用。

foreach (var cookie in Request.Cookies.Keys)
{
    Response.Cookies.Delete(cookie);
}


await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);


Response.Cookies.Append("EdgeAccessCookie", "", new Microsoft.AspNetCore.Http.CookieOptions()
{
    Path = "/",
    HttpOnly = true,
    SameSite = SameSiteMode.Lax, Expires = DateTime.Now.AddDays(-1)
});


Response.Redirect("https://adfs.[sitename].com/adfs/ls?wa=wsignout1.0");
于 2019-03-27T03:55:02.273 回答
1

我见过的最佳答案可以在相关的 StackOverFlow 问题中找到:

是否有相当于 IE 的 ClearAuthenticationCache 的浏览器?

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

基本上,您需要使用无效凭据向服务器发送 AJAX 请求并让服务器接受它们。

于 2011-12-14T15:06:13.723 回答
0

我认为您应该使用表单身份验证,但您可以在如下表单中使用 ldap windows 用户帐户:

using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
    // validate the credentials
    bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}
于 2020-04-28T17:51:19.293 回答