我正在使用 .NET Core 2.2 Razor Pages 中的 .NET Identity 处理 identityserver4 登录站点(服务器 UI),我有一个 javascript 模式警报,警告用户等待空闲超时,然后在达到超时时将用户重定向到通过设置 window.location 退出屏幕
我遇到的问题是快速入门示例中的 OnGet 显示用户提示注销,因为此时 logoutId 为空。我想在不提示用户的情况下注销。
目前,我通过将“autoLogout”参数传递到我的 Logout 页面来解决这个问题,该参数绕过了对 logoutId 的检查并设置 ShowLogoutPrompt = false。我知道这在某种程度上违背了检查 logoutId 以确保在没有提示的情况下安全注销的目的。
有没有更好的方法来做我想做的事情?
2019 年 7 月 16 日编辑:似乎处理空闲超时的“正确”方法是设置应用程序 cookie 的令牌到期时间(比如 20 分钟)并启用 SlidingExpiration,以便在用户刷新时更新令牌。有关这方面的好信息,请参阅此博客文章、此 github 问题线程(包括来自 Brock Allen 的评论)以及MS 文档中的此信息。
我的问题是这个解决方案有两个巨大的缺点。
@(DateTime.Parse(((await Context.AuthenticateAsync()).Properties.Items)[".expires"]))
cookie 方法的另一个不太重要的缺点是,如果我设法实现了一个模态弹出窗口并且用户选择继续,那么页面将需要刷新以获取新令牌,此时任何未保存的数据都将丢失。我想如果他们超时,那么未保存的数据无论如何都会丢失,所以与上述相比,这是一个相对较小的问题。
我正在考虑回到我的原始解决方案,该解决方案具有所需的功能,但会被攻击者滥用,攻击者在空闲超时 javascript 中注意到我的 autoLogout 参数,然后可以使用它来提供指向注销页面的热链接。目前,冒这个险感觉是我最好的选择。
我觉得我在这个问题上陷入了困境,但仍然没有好的解决方案。令我惊讶的是,我想象中的一个常见用例(空闲超时带有警告,允许用户继续/注销)在这种身份验证技术中的表现如此糟糕。我错过了什么吗?我的棍子末端有错吗?
我在这里发布我的最终解决方案。它有效,但我不太喜欢它。作为参考,详细说明为什么我认为它有点 hacky,以及我认为主要缺点的详细信息,请参阅 7 月 16 日对我上面原始问题的编辑。
在添加身份服务器后的 ConfigureServices 中,我设置了 cookie 的 SlidingExpiration = true; ExpireTimeSpan = AppSettings.IdleTimeoutMins(请参阅此博客了解我如何设置 AppSettings):
// Rename the .AspNetCore.Identity.Application cookie and set up for idle timeout
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "xxxx.Application";
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(_config.GetValue<int>("AppSettings:" + nameof(AppSettings.IdleTimeoutMins)));
});
我有一个部分 Razor 页面,其中我有 javascript 代码来向用户显示一个带有倒数计时器的模式警报。我从 AppSettings.IdleTimeoutMins 获得 timeoutSeconds 并且还有一个设置来确定何时显示警告。有关这一点(及其优缺点)的更多详细信息,请参阅我的其他问题和答案:如何在 Razor Page 中获取 ASP.NET Identity 身份验证票证到期?警告消息让用户可以选择“继续”刷新页面(并因此刷新身份验证票)或“注销”,将它们发送到注销确认页面。如果时钟耗尽,则刷新页面,使它们返回到登录屏幕。
在部分的顶部:
@inject RussellLogin.Services.IAppSettings AppSettings;
@using Microsoft.AspNetCore.Authentication;
获取票上剩余的(假设)秒数:
secondsRemaining = "@(DateTime.Parse(((await AuthenticationHttpContextExtensions
.AuthenticateAsync(Context))
.Properties
.Items)[".expires"])
.Subtract(DateTime.Now)
.TotalSeconds)";
// If secondsRemaining is less than half the expiry timespan then assume it will be re-issued
if (secondsRemaining < timeoutSeconds / 2) {
secondsRemaining = timeoutSeconds;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句