Blazor WebAssembly вызывает защищенные методы WebAPI и передает токен-носитель - PullRequest
1 голос
/ 04 мая 2020

У меня есть служба отдыха на локальном хосте: 5002, сервер идентификации на 5000 и приложение Blazor WebAssembly на локальном хосте: 1330. Вероятно, что-то происходит, они не все в одном домене.

Я могу аутентифицироваться с помощью моего приложения Blazor WebAssembly (клиент, а не сервер), которое вызывает вызовы методов WebApi, я получаю возвращенный, 401 не авторизован. Я вручную добавил токен-носитель к запросам, и он отлично работает, возвращая результаты и т.д. c.

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

Мой главный вопрос. Какой лучший способ получить токен на предъявителя и передать его?

1 Ответ

2 голосов
/ 04 мая 2020

IMO лучший способ - использовать IHttpClientFactory и назначить токен с помощью встроенного BaseAddressAuthorizationMessageHandler

Setup 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-запросы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...