带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时

Posted

技术标签:

【中文标题】带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时【英文标题】:Idle-Timeout in ASP.Net Core 3.1 with Windows Authentication 【发布时间】:2021-02-01 21:08:26 【问题描述】:

编辑

让我们保持简单。

如何在 .Net Core 3.1 应用程序中使用 Windows 身份验证实现空闲超时?

为什么使用 Windows 身份验证:因为当使用 Windows (Active Directory) 进行身份验证时,我们无法注销。

Idle-Timeout:此功能表示如果屏幕空闲一段时间(可以在IIS中配置->Application Pools->Select Pool ->Advanced Settings->Idle Timeout :(默认:20 分钟))应用程序应该注销并再次要求登录。或者应该转到startup.cs中设置的404页

很高兴

    使用 Windows 身份验证 尝试从 IIS 应用程序池实现空闲超时。 它应该(也)在部署到 IIS 后工作。

当前行为

应用程序在空闲超时后关闭。

尝试浏览(单击任何链接)它再次启动应用程序

尝试logout windows authentication,但没有成功

预期行为/输出

    Windows 身份验证的登录对话框弹出窗口

和/或

    idle-timeout 后应该达到 404

【问题讨论】:

空闲超时的 IIS 工作进程(应用程序池)设置与最终用户空闲或 Windows 身份验证(Kerberos 或 NTLM)完全无关。它只关心在应用程序处于非活动状态时减少服务器上的内存负载(w.r.t. 处理 HTTP 请求,无论最终用户在浏览器窗口中做什么或在工作进程中运行的任何后台任务)。 @Dai:我相信你是对的。因此它不起作用。您能否对功能提供更多指导 在页面或 service-worker 中使用 AJAX(好吧,fetch)每隔几分钟发送一次请求,以保持用户的身份验证令牌有效 - 但我承认我不确定这是如何工作的使用 Kerberos/NTML。 使用 Windows 身份验证,只要服务器返回 401 响应,您的浏览器就会登录。但可以使用缓存的用户名/密码或当前本地用户令牌自动登录。我不相信有办法强制浏览器提示。 @JeremyLakeman:NP。我明白了,但肯定会有 404 的出路。这意味着在空闲超时到期后,它会达到 404 就是这样 【参考方案1】:

我认为你所要求的不是直接可能的,但你可以接近。我不会在这里提供任何代码,因为这可能会变得很复杂,但是我希望它可以帮助您思考这个问题。我同意 @jeremy-lakeman 的观点,即这是您正在寻找的“反功能”,也许您可​​以重新定义问题。

Windows 身份验证

当服务器发回 401 时,Windows 将自动通过 kerberos 进行身份验证。这对用户是透明的,并且没有登录页面。在您的情况下,这是由 IIS 处理的。在使用 Windows 身份验证时,您绝不应该显示登录页面。

Cookie 认证

本质上,这是在浏览器上存储一个用于验证用户身份的 cookie。 Asp.Net Core 3.1 本机包含此功能,并且可以轻松支持此功能。 cookie 在应用程序级别进行身份验证。此 cookie 可能有过期时间,并且您在页面中嵌入了一个登录表单。当您创建一个新项目时,这是“个人帐户”选项。

两者的混合

想象一个如下世界:

您有两个应用程序。您的主要应用程序配置了 Cookie 身份验证(我们将其称为“主要”),而辅助应用程序配置为使用 Windows 身份验证(称为“次要”)。您也可以使用 IIS 执行此操作,并将 Windows 身份验证用于一个特定路径,但更容易将其视为两个独立的应用程序。

当您向 Primary 发出请求时,您的应用会验证 cookie。如果不存在 cookie,或者它被拒绝(因为超时命中),您将被重定向(不是 401 Unauthorized,一个 302 Found)到 Secondary,它所做的只是 Windows auth。它可以重新生成 cookie,然后将您送回 Primary。

但是,这并没有显示登录页面,我认为这是问题的症结所在。您希望在同一个应用程序中同时拥有自动登录和手动登录。如果你有自动登录,过期有什么用?他们只会刷新并再次获得身份验证。

如果您放弃自动登录(通过 Windows 身份验证)的想法,您只能使用一个带有 Cookie 身份验证的应用程序。

仅 Cookie

在这种情况下,您只有有 Primary 设置,并且它只进行 cookie 身份验证。您可以拥有一个针对 Active Directory 进行身份验证的身份提供程序。这是 Windows 身份验证,但在应用程序级别,而不是在 IIS 级别。

您将不得不在自动登录或超时之间进行选择。没有一个合理的世界可以两者兼得。

【讨论】:

以上是关于带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时的主要内容,如果未能解决你的问题,请参考以下文章

应用级别内联网用户的 Windows 身份验证(带有 VB 的 ASP.NET)

ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)

带有 Angular 6 的 Asp.Net Core 2.1 中的 Windows 身份验证 - Chrome 连续登录提示

如何在 ASP.NET Core 中将角色添加到 Windows 身份验证

无法使用 Windows 身份验证发布到 asp.net core web api

在 HTTPS 上使用 Windows 身份验证首次调用 ASP.NET Core 2.0 Web API 在 Chrome 中总是失败