【问题标题】:Make Strawberry Shake request from Blazor with or without credentials使用或不使用凭据从 Blazor 发出 Strawberry Shake 请求
【发布时间】:2023-02-24 04:26:53
【问题描述】:

在我的 Blazor 应用程序(使用 Azure B2C)中,我希望能够调用端点,无论用户是否经过身份验证。

我搜索了很多,发现的所有内容都表明我应该创建两个 HttpClients (example),一个用于匿名,一个用于经过身份验证,或者将 IHttpClientFactory 用于命名客户端。

问题是我使用的是Strawberry Shake,它只允许我配置一次HttpClient(它在内部使用命名客户端和IHttpClientFactory)。

他们的文档给出了一个设置身份验证的简单示例:

services
    .AddConferenceClient()
    .ConfigureHttpClient((serviceProvider, client) =>
    {
        var token = serviceProvider.GetRequiredService<ISomeService>().Token;
    });

我以为我可以使用它来有条件地选择我想要的处理程序,但我能找到获取令牌 (IAccessTokenProvider.RequestAccessToken()) 或验证身份验证 (Task&lt;AuthenticationState&gt;) 的唯一方法需要异步调用,这在这个上下文。即使 .Result 也不起作用(不是我想用它)。

我最后的想法是,也许我可以通过从 BaseAddressAuthorizationMessageHandler 继承或链接处理程序来完成此操作,但我不知道如何实现。我什至尝试复制源代码并修改它,但仍然无法让它工作(更新:实际上,它确实有效,但它似乎仍然不太理想)。

这么多方法似乎可行,但最终都让我失望了。我怎样才能让它工作?如果可能,请提供代码示例。

【问题讨论】:

    标签: asp.net-core dotnet-httpclient hotchocolate


    【解决方案1】:

    这已经是一个有点老的问题了,但我遇到了同样的问题,找不到任何合适的解决方案。

    我能够通过注册 GraphQL 客户端和自定义 AuthorizationMessageHandler 来使其工作,如下所示:

    builder.Services.TryAddTransient<GraphQlAuthorizationMessageHandler>();
    builder.Services
        .AddConferenceClient()
        .ConfigureHttpClient(client =>
        {
            client.BaseAddress = new Uri("http://localhost:5000/graphql");
        }, 
        configureClientBuilder =>
        {
            configureClientBuilder.AddHttpMessageHandler<GraphQlAuthorizationMessageHandler>();
        });
    

    我的GraphQlAuthorizationMessageHandler 很简单:

    public sealed class GraphQlAuthorizationMessageHandler : AuthorizationMessageHandler
    {
        public GraphQlAuthorizationMessageHandler(IAccessTokenProvider provider, NavigationManager navigation)
            : base(provider, navigation)
        {
            base.ConfigureHandler(new [] {"http://localhost:5000/graphql" });
        }
    }   
    

    它之所以有效,是因为现有的 AuthorizationMessageHandler (github) 类已经包含将令牌添加到 Authorization 标头的逻辑。使其工作的唯一要求是使用我们希望它注入标头的 URL 配置处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 2018-10-31
      • 2019-10-12
      • 1970-01-01
      • 2018-08-30
      • 2017-11-20
      • 1970-01-01
      • 2016-03-05
      相关资源
      最近更新 更多