在 Blazor 服务器端应用程序中,OpenID 身份验证提供程序提供了在客户端注销用户的机制。但是,当使用 OpenID 登录时,这种机制可能会失效,导致用户无法注销。这个问题可以通过以下步骤解决:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.Cookie.Name = "BlazorServerSideAuthentication";
})
.AddOpenIdConnect(options =>
{
options.Authority = "https://demo.identityserver.io/";
options.ClientId = "interactive.public";
options.ResponseType = "code";
options.SaveTokens = true;
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProviderForSignOut = async ctx =>
{
var accessToken = await ctx.HttpContext.GetTokenAsync("access_token");
if (!string.IsNullOrEmpty(accessToken))
{
ctx.ProtocolMessage.IdTokenHint = await ctx.HttpContext.GetTokenAsync("id_token");
ctx.ProtocolMessage.PostLogoutRedirectUri = ctx.Properties.RedirectUri;
ctx.ProtocolMessage.State = ctx.Properties.Items[".xsrf"];
}
}
};
});
@page "/"
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
@code {
private async Task Logout()
{
await HttpContext.SignOutAsync("cookie");
await HttpContext.SignOutAsync("oidc");
}
}
这个事件处理程序调用 HttpContext.SignOutAsync 方法注销当前用户的 cookie 和 OpenID 连接。
通过这些步骤,您应该能够成功注销 OpenID 身份验证提供程序。