我有一个面向 .NET 8 的 Blazor WebAssembly 应用程序。我正在使用 OIDC 身份验证,并已成功与 Keycloak 集成。我当前的配置如下所示:
// Program.cs
builder.Services.AddOidcAuthentication(options =>
{
options.ProviderOptions.DefaultScopes.Clear();
builder.Configuration.Bind("Oidc", options.ProviderOptions);
});
// appsettings.json
{
"Oidc": {
"Authority": ".../.well-known/openid-configuration",
"ClientId": "client1",
"PostLogoutRedirectUri": "http://localhost:8081",
"DefaultScopes": [
"openid"
],
"ResponseType": "code"
}
}
开发 Keycloak 服务器一切正常,但我在另一家公司的生产服务器上遇到了问题,其中 userinfo 端点出现故障。 /token 调用成功,并且我收到有效响应,但对 /userinfo 端点的后续调用失败。有没有办法在 OIDC 身份验证配置中禁用 userinfo 端点?
我没有成功地搜索选项来找到禁用 userinfo 调用的方法。我的第二次尝试是使用自定义 AuthenticationStateProvider,但我也无法完全完善该方法。
您可以从 CustomAuthenticationStateProvider 中的 accesstoken 解析用户声明
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly IAccessTokenProvider _tokenProvider;
public CustomAuthenticationStateProvider(IAccessTokenProvider tokenProvider)
{
_tokenProvider = tokenProvider;
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var tokenResult = await _tokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var accessToken))
{
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(accessToken.Value);
var identity = new ClaimsIdentity(jwtToken.Claims, "jwt");
var user = new ClaimsPrincipal(identity);
return new AuthenticationState(user);
}
//return empty identity.
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
}
}