【问题标题】:Grpc token expiration handlingGrpc令牌过期处理
【发布时间】:2021-08-22 17:37:04
【问题描述】:

我在我的 blazor-wasm 应用程序中使用 grpc 代码优先,但我不明白应该如何处理令牌过期。

据我了解,我需要一个客户端拦截器来检查过期时间并向服务器发出更新请求。

 public static WebAssemblyHostBuilder AddGrpc(this WebAssemblyHostBuilder builder)
        {
            builder.Services
                .AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>()
                .CreateClient(BaseClient));

            builder.Services.AddScoped(services =>
            {
                var baseAddressMessageHandler = services.GetRequiredService<AuthenticationHeaderHandler>(); // <= adds the authorization header
                baseAddressMessageHandler.InnerHandler = new HttpClientHandler(); // <= I tried adding a custom handler, but it didn't work either
                var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb, baseAddressMessageHandler);
                var channel = GrpcChannel.ForAddress(builder.HostEnvironment.BaseAddress, new GrpcChannelOptions { HttpHandler = grpcWebHandler });
                return channel;
            });

            return builder;
        }

如何正确解决这个问题?

【问题讨论】:

    标签: c# authentication grpc code-first blazor-webassembly


    【解决方案1】:

    解决方案:

     builder.Services.AddScoped(services =>
                {
                    var authManager = services.GetRequiredService<IAuthenticationManager>();
                    var navManager = services.GetRequiredService<NavigationManager>();
                    var credentials = CallCredentials.FromInterceptor(async (context, metadata) =>
                    {
                        try
                        {
                            await authManager.TryRefreshToken();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            navManager.NavigateTo("/login");
                        }
                    });
                    var baseAddressMessageHandler = services.GetRequiredService<AuthenticationHeaderHandler>();
                    baseAddressMessageHandler.InnerHandler = new HttpClientHandler();
                    var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb, baseAddressMessageHandler);
                    var channel = GrpcChannel.ForAddress(builder.HostEnvironment.BaseAddress, new GrpcChannelOptions
                    {
                        HttpHandler = grpcWebHandler,
                        Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
                    });
                    return channel;
                });
    

    CallCredentials.FromInterceptor我们可以检查令牌并更新它。

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2023-03-20
      • 2019-03-21
      • 2021-09-06
      • 2021-10-19
      • 2015-10-05
      • 2019-12-11
      • 2021-12-31
      相关资源
      最近更新 更多