Authentication Blazor Web组件(wasm)赢得';在刷新页面之前,不要使客户端cookie过期

Authentication Blazor Web组件(wasm)赢得';在刷新页面之前,不要使客户端cookie过期,authentication,jwt,blazor,identityserver4,blazor-webassembly,Authentication,Jwt,Blazor,Identityserver4,Blazor Webassembly,我使用的是Visual Studio 2019中最新的.NET 5 Blazor Web部件核心托管模板。它已经支持开箱即用的身份验证 问题是,我可以在.NET托管(服务器)端使Cookie过期,方法ConfigureServices(IServiceCollection services)中的Startup.cs如下所示: 但是,我的要求是,当会话在20分钟后过期时,应该要求用户再次登录。我的问题是,cookie只有在浏览器关闭或用户点击“重新加载”时才会过期。同时,我可以点击所有控制器,即使

我使用的是Visual Studio 2019中最新的.NET 5 Blazor Web部件核心托管模板。它已经支持开箱即用的身份验证

问题是,我可以在.NET托管(服务器)端使Cookie过期,方法ConfigureServices(IServiceCollection services)中的Startup.cs如下所示:

但是,我的要求是,当会话在20分钟后过期时,应该要求用户再次登录。我的问题是,cookie只有在浏览器关闭或用户点击“重新加载”时才会过期。同时,我可以点击所有控制器,即使它们有[Authorize]标签。理想的情况是,当用户调用控制器时,它会重定向到登录

Cookie是在登录后创建的


时间一过,cookies就消失了,但用户仍然拥有所有权限。

使用以下函数将Utilities.js javaScript文件添加到客户端项目中的wwwroot/js

function initializeInactivityTimer(dotnetHelper) {
var timer;
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;

function resetTimer() {
    clearTimeout(timer);
    timer = setTimeout(logout, 1200000);
}

function logout() {
    dotnetHelper.invokeMethodAsync("Logout");
}}
确保将其添加到wwwroot/index.html的末尾

 <script src="js/Utilities.js"></script>
确保将MainLayout.razor添加到顶部

@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject IJSRuntime js
@inject SignOutSessionStateManager SignOutManager
还要添加此级联参数

[CascadingParameter]
public Task<AuthenticationState> AuthenticationState { get; set; }
在StartUp.cs上保留所有修改。它们适用于用户重新加载或关闭浏览器时。如果没有鼠标移动或按键,此js函数将注销用户

参考文献


问题在于,由于cookie已过期,您的用户不再经过身份验证,因此身份验证状态从未更新。解决方案需要您的一些投资和知识。一般来说,您应该实现身份验证状态提供程序,在该提供程序中,您应该有代码(循环)来检查cookie是否会在20分钟后过期,如果会过期,您可以警告您的用户这一事实,或者让他注销并登录,在使用IdentityServer继续您的项目之前,请确保您已经阅读了Microsoft的这篇文章()及其附带的注释。就我个人而言,我已经完成了IdentityServer。@enet您有这样一个例子吗?我似乎在网上找不到任何东西。不,对不起,我不知道有任何代码示例在互联网上这样做。。。但是,您应该首先检查RevalidatingServerAuthenticationStateProvider类及其派生类(注意:它是Blazor服务器,不是WebAssembly,但它应该让您了解如何实现身份验证状态提供程序)。您需要重写某个方法,该方法可以访问cookie的过期时间,例如数据。。。从该方法中,您需要触发一个事件,该事件可能由MainLayout组件订阅,以通知cookie已过期,即将..等等
@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject IJSRuntime js
@inject SignOutSessionStateManager SignOutManager
[CascadingParameter]
public Task<AuthenticationState> AuthenticationState { get; set; }
await js.InvokeVoidAsync("initializeInactivityTimer",  DotNetObjectReference.Create(this));