我有一个与 KeyCloak (V26) 集成的 Blazor Server Web 应用程序 (.Net 9) 用于身份验证。应用认证流程:
对于注销,预期行为是重定向到 KeyCloak、启动注销并重定向回 Blazor 应用主页。相反,在注销时,Blazor 应用程序会重定向到 KeyCloak,并且我收到“缺少参数:id_token_hint”错误。
Blazor 应用程序 - 注销代码:
@page "/logout"
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Authentication.Cookies
@using Microsoft.AspNetCore.Authentication.OpenIdConnect
@using Microsoft.AspNetCore.Identity
@inject IConfiguration Configuration
<PageTitle>Log Out</PageTitle>
@code {
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
if (HttpMethods.IsGet(HttpContext.Request.Method))
{
// sign-out from the default authentication scheme
await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties
{
RedirectUri = "/"
});
// sign-out from the cookie authentication scheme
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}
}
KeyCloak - 注销错误
根据我的调查,客户端 Id 或 Id_Token_Hint 需要在注销 URI 中传递。我手动(在浏览器中)在注销 URI 查询字符串中添加了客户端 ID,它提供了一个单击“注销”的选项,但我不喜欢这个选项。如何获取和设置 Id_Token_Hint,以便发生注销并重定向到 Blazor 应用程序主页?请帮忙。
如果您使用
Microsoft.AspNetCore.Authentication.OpenIdConnect
,则需要启用SaveTokens。
builder.Services.AddAuthentication(...)
.AddCookie()
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
...
options.SaveTokens = true; //important to get idtoken or will report missing id_token_hint
});