Windows 身份验证 - 以编程方式注销用户?

Posted

技术标签:

【中文标题】Windows 身份验证 - 以编程方式注销用户?【英文标题】:Windows authentication - programmatically sign user out? 【发布时间】:2019-01-02 08:01:47 【问题描述】:

如果我有一个使用 Windows 身份验证设置的 Asp.NET Core 2.1 网站,如何让使用 Windows 身份验证登录的用户退出?

我看到了this 的帖子,但它是在 2009 年被问到的。只是想知道现在是否可以退出 Windows 用户。

【问题讨论】:

“注销用户”究竟是什么意思? 用户 还没有从他的机器上注销。 Web 应用程序的“退出”意味着“终止会话”。问题是要求错误的东西 您可以像在任何 Web 应用程序中一样终止用户会话。通过设置超时、通过用户的显式操作(例如单击Sign out 按钮)或通过关闭页面时的 javascript 操作 为什么您要询问有关退出 Windows 用户的问题?您要解决的实际问题是什么?存储sign out 日期?结束用户的会话?跟踪在线状态?还有什么?请记住,HTTP 是无状态,唯一跟踪登录/退出状态的是应用程序本身 @PanagiotisKanavos 我很好奇,因为使用该站点的用户有两个不同的窗口帐户:一个普通帐户,一个管理员帐户。我希望通过检测他们使用的帐户并说“嘿,这是错误的帐户,单击此处退出并使用正确的帐户重新登录”来让他们的生活更轻松。到目前为止,它确实显示了该消息,我只是希望通过再次提供登录屏幕来让他们更轻松。 您是在询问 Windows 身份验证还是针对 AD 的表单身份验证?在第一种情况下,没有登录可以退出。第二种情况只是针对 AD 存储而不是数据库的表单身份验证。 【参考方案1】:

简短回答:不。

您需要使用Forms Authentication。自发布该问题以来,Windows Authetication 流程没有改变。

如果您不想迁移到表单身份验证,您可以通过在数据库中为该用户管理 logged on 布尔值然后返回 401 Unauthorized 来创建自己的“注销”表单。我强烈建议不要这样做,你应该实施Forms Authentication

【讨论】:

没有什么可以退出的。用户尚未从 Windows 注销,因此任何打开 Web 应用程序的尝试始终有效。从 Web 应用程序中退出通常意味着“终止会话” @PanagiotisKanavos 什么?还是可以这样处理的。您可以通过基于数据库值“登录”来阻止该用户的请求来在服务器端处理它。这只是一个糟糕的解决方案,不应该使用。 @Ridell 什么什么什么?这不是 Windows 身份验证 的工作方式。没有需要退出的“登录”。用户由 他/她 机器进行身份验证。令牌通过请求标头发送到服务器。服务器验证该令牌并检查它是否是允许的用户。 屏蔽用户,为什么?并且持续多久?毕竟,请求已经通过了身份验证。 @PanagiotisKanavos 我确切地知道它是如何工作的。你显然不明白我在说什么。您仍然可以根据经过身份验证的请求呈现不同的页面。这是一种hacky方式,这就是我在答案中所说的。我发现你的 cmets 与这个问题的两个答案都无关。【参考方案2】:

这仍然成立:

使用“Windows”时,服务器端的注销按钮将不起作用 验证。如果你想要一个,你必须使用“表单”身份验证 退出按钮,或关闭用户的浏览器。

因此,如果您希望能够注销用户,则需要使用不同形式的身份验证

【讨论】:

没有什么可以退出的。用户尚未从 Windows 注销,因此任何打开 Web 应用程序的尝试始终有效。从 Web 应用程序中退出通常意味着“终止会话”

以上是关于Windows 身份验证 - 以编程方式注销用户?的主要内容,如果未能解决你的问题,请参考以下文章

React Native:登录或注销时如何以编程方式刷新应用程序?

使用 Spring Security 4 以编程方式对用户进行身份验证

从 C# 以编程方式进行 Firebase 身份验证用户管理

如何使用 DaoAuthenticationProvider 以编程方式使用 Spring Security 对用户进行身份验证

以编程方式对用户进行身份验证以进行 PhpUnit 功能测试 - 不受 Doctrine 管理 - Symfony 4.3

如何结合单点注销和无状态身份验证