【问题标题】: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<AuthenticationState>) 的唯一方法需要异步调用,这在这个上下文。即使 .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 配置处理程序。