Blazor WebAssembly调用受保护的WebAPI方法并中继承载令牌



我有一个restful服务在localhost:5002上运行,Identity server在5000上运行,Blazor WebAssembly应用程序在localhost:1330上运行。他们可能不在同一个域上。

我可以使用我的Blazor WebAssembly应用程序(客户端而非服务器(进行身份验证,该应用程序调用WebApi方法,我被返回,401未经授权。我已经手动将承载令牌添加到请求中,它可以完美地返回结果等。

HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "{{BEARER TOKEN VALUE}}");

我的主要问题是。获得Bearer代币并将其传递的最佳方式是什么?

IMO最好的方法是使用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请求以获取更多信息。

相关内容

  • 没有找到相关文章

最新更新