我在localhost:5002上运行了一个restful服务,在5000上运行了身份服务器,在localhost:1330上运行了Blazor WebAssembly应用。可能是它们不在同一个域上。
我可以用我的Blazor WebAssembly应用程序(客户端而不是服务器)进行身份验证,然后调用WebApi方法,我得到的回报是401未授权。我已经手动添加了不记名标记到请求中,它可以完美地返回结果等。
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "{{BEARER TOKEN VALUE}}");
我的主要问题是。有什么最好的方法来获取Bearer token并将其传递出去?
我认为最好的方法是使用 IHttpClientFactory
并通过使用内置的 BaseAddressAuthorizationMessageHandler
设置DI
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
builder.Services.AddOidcAuthentication<RemoteAuthenticationState, RemoteUserAccount>(options =>
{
options.ProviderOptions.Authority = "http://localhost:5000";
options.ProviderOptions.ClientId= "{YOUR CLIENT ID}";
options.ProviderOptions.RedirectUri= "http://localhost:1330/authentication/login-callback";
})
.AddHttpClient("apiClient")
.ConfigureHttpClient(httpClient =>
{
httpClient.BaseAddress = "http://localhost:5002";
})
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
await builder.Build().RunAsync();
}
}
在组件或服务中使用,注入一个 IHttpClientFactory
元件样品
@inject IHttpClientFactory _factory
@code {
protected override async Task OnInitializedAsync()
{
var client = _factory.CreateClient("apiClient")
var data = await client.GetJsonAsync<Data>("api/data");
}
}
有多种使用方法 IHttpClientFactory
,改为 使用IHttpClientFactory来实现弹性的HTTP请求。 更多信息。