如何为 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#代码的网站