Blazor WebAssembly调用受保护的WebAPI方法并转发承载令牌。

问题描述 投票:1回答:1

我在localhost:5002上运行了一个restful服务,在5000上运行了身份服务器,在localhost:1330上运行了Blazor WebAssembly应用。可能是它们不在同一个域上。

我可以用我的Blazor WebAssembly应用程序(客户端而不是服务器)进行身份验证,然后调用WebApi方法,我得到的回报是401未授权。我已经手动添加了不记名标记到请求中,它可以完美地返回结果等。

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

我的主要问题是。有什么最好的方法来获取Bearer token并将其传递出去?

c# identityserver4 blazor bearer-token
1个回答
2
投票

我认为最好的方法是使用 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请求。 更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.