如何在Blazor Server应用中实现Microsoft Identity无账户选择程序化登出
Blazor Server 基于Microsoft Identity Platform无账号选择框程序化登出实现方案
问题根源
- 仅调用Cookie scheme登出:只会清除本地应用的登录Cookie,微软身份平台侧的用户会话仍然有效,所以刷新页面后会触发SSO自动重新登录
- 仅调用OIDC scheme登出但未携带账号标识:微软身份平台无法确认要注销的账号,因此弹出账号选择框
实现步骤
步骤1:配置身份选项保存ID令牌
首先需要在服务注册时开启令牌保存,以便后续获取id_token作为登出的账号标识,代码如下:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); // 关键配置:保存id_token到用户身份属性中 options.SaveTokens = true; });
步骤2:编写正确的登出逻辑
登出时需要同时处理本地Cookie注销和微软身份平台的远程会话注销,并且携带id_token_hint参数告知平台要注销的账号,避免弹出选择框,代码示例:
app.Use(async (context, next) => { if (context.Request.Path.Equals("/logout", StringComparison.OrdinalIgnoreCase)) { // 先从已保存的令牌中获取id_token var idToken = await context.GetTokenAsync("id_token"); // 配置登出参数,携带id_token和登出后跳转地址 var authProperties = new AuthenticationProperties { RedirectUri = "/", Parameters = { ["id_token_hint"] = idToken } }; // 同时登出Cookie和OIDC两个认证方案 await context.SignOutAsync(new[] { CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme }, authProperties); return; } await next(); });
注意:登出后跳转的地址需要在Azure AD应用注册的「重定向URI」中配置为Web类型的登出重定向URI,否则微软身份平台会拒绝跳转请求。
内容的提问来源于stack exchange,提问作者Browen
相关产品推荐
相关产品推荐

