如何为 Blazor WebAssembly 和 IdentityServer 4 配置持久登录?

Posted

技术标签:

【中文标题】如何为 Blazor WebAssembly 和 IdentityServer 4 配置持久登录?【英文标题】:How to configure persistent login for Blazor WebAssembly and IdentityServer 4? 【发布时间】:2021-06-07 12:44:37 【问题描述】:

我们有一个独立的 Blazor WebAssembly 应用程序 (PWA),用户需要通过 IdentityServer 4(使用默认设置)对自己进行身份验证 (OIDC)。 IdentityServer 然后返回一个访问令牌,应用程序使用该令牌调用多个 api。大多数用户在移动设备上使用该应用程序,并且需要在收到通知后使用该应用程序(每小时一次或两次)。一切都运行良好,但由于用户登录不会在白天持续存在,他们需要每天多次重新验证自己。对于用户来说,这真是令人讨厌的行为。因此,我正在寻找一种解决方案,让用户登录至少持续 x 小时。我阅读了几篇博客并尝试更改 IdentityServer 上的设置,但我似乎无法更改此行为。

实际行为:

当用户的会话关闭时,用户将被注销,需要重新登录 IdentityServer。 大约 1 小时后,用户以任一方式退出。

预期行为:

用户的登录信息在多个会话中保持不变,例如总共 x 小时(我实际上不知道这是否可能?)。 只要用户登录并且应用程序处于活动状态(在后台),用户就会保持身份验证状态。

如果用户在使用应用程序时保持身份验证,这已经很有帮助。但是,值 1 小时的唯一设置(我可以在 IdentityServer 中找到)是访问令牌生命周期,默认为 3600 秒。不过,我还读到,这与我的用户必须重新验证自己的问题无关。

我想我忽略了一些东西,但我就是不知道如何解决这个问题。任何帮助表示赞赏!

更新

在我的 Blazor WebAssembly 项目中,Program.cs 中有以下配置

      builder.Services.AddOidcAuthentication(options =>
            
                builder.Configuration.Bind("IdentityService", options.ProviderOptions);
            );

And in appsettings.json:

    "IdentityService": 
        "Authority": "https://localhost:44362",
        "ClientId": "MyBlazorClient",
        "DefaultScopes": [
            "openid",
            "profile",
            "claims",
            "roles"
        ],
        "ResponseType": "code"
    ,

在 IdentityServer 中,我的 StartUp.cs 得到以下信息

    var builder = services.AddIdentityServer(options =>
            
                options.Events.RaiseErrorEvents = true;
                options.Events.RaiseInformationEvents = true;
                options.Events.RaiseFailureEvents = true;
                options.Events.RaiseSuccessEvents = true;
                options.UserInteraction.LoginUrl = "/Account/Login";
                options.UserInteraction.LogoutUrl = "/Account/Logout";
                options.Authentication = new AuthenticationOptions()
                
                    CookieLifetime = TimeSpan.FromHours(8), 
                    CookieSlidingExpiration = true
                ;
            )

最后,这是我在 IdentityServer 中的客户端配置:

    new Client
    
        ClientId = "MyBlazorClient",
        ClientName = "My Blazor Client Application",
        RequireClientSecret = false,
        AllowedCorsOrigins =  https://localhost:443 ,
        AllowedGrantTypes = GrantTypes.Code,
        RedirectUris =  "https://localhost:443/authentication/login-callback" ,
        PostLogoutRedirectUris =  "https://localhost:443/authentication/logout-callback" ,
        AllowedScopes = new List<string>
        
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile,
            "roles",
            "claims"
        ,
        RequirePkce = true,
        AllowPlainTextPkce = false,
    ,

【问题讨论】:

【参考方案1】:

您能否使用您的 Startup.cs 文件和所有身份/身份验证配置更新问题?

您可能没有设置 Identity Server 支持的应用程序 Cookie。这是一个例子:

services.ConfigureApplicationCookie(options =>

    options.Cookie.Name = "MyAppCookie";
    options.Cookie.HttpOnly = true;
    options.Cookie.SameSite = SameSiteMode.Strict;
    options.ExpireTimeSpan = TimeSpan.FromDays(1);
    options.Cookie.MaxAge = TimeSpan.FromDays(7);
    options.SlidingExpiration = true;
    options.LoginPath = "/login";
    options.LogoutPath = "/logout";
    options.AccessDeniedPath = "/error";
    options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
);

【讨论】:

我用我的身份配置更新了问题。 您仍然应该尝试添加应用程序 Cookie,因为 Identity Server 使用这些设置来配置它。

以上是关于如何为 Blazor WebAssembly 和 IdentityServer 4 配置持久登录?的主要内容,如果未能解决你的问题,请参考以下文章

不用Blazor WebAssembly,开发在浏览器端编译和运行C#代码的网站

如何为 blazor 应用程序中的绑定变量设置后备值?

如何为 Blazor Web Assembly 实现缓存清除

blazor wasm开发chrome插件

Blazor WebAssembly 3.2 正式发布

Blazor正式成为Microsoft官方.NET 和WebAssembly项目