如何在Blazor WASM OIDC认证中禁用userinfo端点
解决Blazor WASM OIDC禁用/userinfo端点调用的问题
要禁用OIDC认证流程中的/userinfo调用,最可靠的方式是自定义OidcUserService,替换默认实现来跳过该请求。默认的OidcUserService会在获取token后自动调用/userinfo端点,我们可以重写它的逻辑,直接从id_token中解析用户信息。
步骤1:创建自定义OidcUserService
实现一个继承自OidcUserService<RemoteUserAccount>的类,重写GetUserAsync方法,跳过/userinfo调用,直接解析id_token中的声明:
using Microsoft.AspNetCore.Components.WebAssembly.Authentication; using Microsoft.IdentityModel.Protocols.OpenIdConnect; using System.IdentityModel.Tokens.Jwt; public class CustomOidcUserService : OidcUserService<RemoteUserAccount> { public CustomOidcUserService(IOidcConfigurationProvider configurationProvider, HttpClient httpClient) : base(configurationProvider, httpClient) { } public override Task<RemoteUserAccount> GetUserAsync(OpenIdConnectMessage message, CancellationToken cancellationToken) { var account = new RemoteUserAccount(); // 直接解析id_token中的所有声明 if (JwtSecurityTokenHandler.CanReadToken(message.IdToken)) { var jwtToken = new JwtSecurityToken(message.IdToken); account.AdditionalProperties = jwtToken.Claims .ToDictionary(claim => claim.Type, claim => (object)claim.Value); } return Task.FromResult(account); } }
步骤2:注册自定义服务
在Program.cs中替换默认的IOidcUserService实现,同时保留原有的OIDC配置:
builder.Services.AddOidcAuthentication(options => { options.ProviderOptions.DefaultScopes.Clear(); builder.Configuration.Bind("Oidc", options.ProviderOptions); }) .AddAccountClaimsPrincipalFactory<RemoteUserAccount, CustomUserClaimsPrincipalFactory>(); // 替换默认的OidcUserService为自定义实现 builder.Services.Replace(ServiceDescriptor.Scoped<IOidcUserService, CustomOidcUserService>());
注意事项
- 确保生产环境返回的id_token已包含所有你需要的用户声明,因为跳过/userinfo后,只能从id_token中获取用户信息。可以通过解码id_token检查payload里的内容。
- 如果生产环境的id_token没有包含必要声明,需要和对方确认是否可以在id_token中添加,或者调整自定义逻辑(比如添加/userinfo调用的错误处理,忽略调用失败的情况)。
内容的提问来源于stack exchange,提问作者Branimir
相关产品推荐
相关产品推荐

