.NET 8 Blazor WASM升级中gRpc认证通道创建故障求助
.NET 8 Blazor WASM gRPC 认证通道配置解决方案
在.NET 8 Blazor WASM中,认证相关的服务注册逻辑有调整,BaseAddressAuthorizationMessageHandler不再自动注入,需要手动结合IAccessTokenProvider完成配置,以下是针对性的解决步骤:
第一步:确保正确注册认证服务
首先要确认Program.cs中已正确添加Microsoft Identity认证服务(以MSAL为例),这是IAccessTokenProvider能被注入的前提:builder.Services.AddMsalAuthentication(options => { builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); // 添加gRPC API所需的权限范围 options.ProviderOptions.DefaultAccessTokenScopes.Add("your-grpc-api-scope"); });第二步:手动注册
BaseAddressAuthorizationMessageHandler
显式注册该Handler,并关联IAccessTokenProvider和应用基础地址:builder.Services.AddTransient<BaseAddressAuthorizationMessageHandler>(sp => { var tokenProvider = sp.GetRequiredService<IAccessTokenProvider>(); var handler = new BaseAddressAuthorizationMessageHandler(tokenProvider, builder.HostEnvironment.BaseAddress); handler.InnerHandler = new HttpClientHandler(); return handler; });第三步:构建带认证的gRPC通道
方式一:直接通过服务提供者获取Handler构建通道var baseAddressMessageHandler = sp.GetRequiredService<BaseAddressAuthorizationMessageHandler>(); var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb, baseAddressMessageHandler); var channel = GrpcChannel.ForAddress(builder.HostEnvironment.BaseAddress, new GrpcChannelOptions { HttpHandler = grpcWebHandler });方式二:通过HttpClientFactory配置更简洁
推荐用这种方式统一管理HttpClient和Handler:// 注册带认证和gRPC Web支持的HttpClient builder.Services.AddHttpClient("GrpcAuthClient", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)) .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>() .AddGrpcWeb(); // 后续创建通道时直接复用该HttpClient var authHttpClient = sp.GetRequiredService<IHttpClientFactory>().CreateClient("GrpcAuthClient"); var channel = GrpcChannel.ForAddress(builder.HostEnvironment.BaseAddress, new GrpcChannelOptions { HttpClient = authHttpClient });第四步:检查依赖注入顺序
确保认证服务的注册代码(AddMsalAuthentication)在gRPC相关服务注册之前,否则IAccessTokenProvider无法被正确注入到BaseAddressAuthorizationMessageHandler中。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

