Blazor навигация с авторизационным заголовком и токеном на предъявителя - PullRequest
0 голосов
/ 11 марта 2020

Я хочу создать портал HealthChecks через HealthChecksUI , но с ограниченным доступом с авторизацией.
Также я использую Blazor для выполнения sh создания диалога авторизации и получения токена доступа.

Итак, я настраиваю HealthChecksUI:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseEndpoints(endpointsBuilder =>
    {
        //...
        endpointsBuilder.MapHealthChecksUI(setup =>
        {
            setup.UIPath = "/portal";
            setup.ApiPath = "/portal/api";
            setup.WebhookPath = "/portal/webhooks";
            setup.ResourcesPath = "/portal/resources";
        }).RequireAuthorization(); // This means access to '/portal' route will be limited by authorization.
        //...
    }
    //...
}

Я использую маркер переноса в HTTP-заголовок авторизации для авторизации при выполнении любого запроса.

Далее давайте проверим работу по авторизации:
GET-запрос от POSTMAN с успешным токеном-носителем для маршрута '/ portal', успешно пройденного. Также, если я меняю токен, я получаю 401 Несанкционированную ошибку. Похоже, система авторизации работает правильно.

Следующим шагом будет использование диалога авторизации для получения и перенаправления токена на страницу портала.
Код ниже - это просто простая функция авторизации с использованием страницы .razor

private async Task SubmitAsync()
{
    var (authorizationSuccessful, accessToken) = await authorizationService.AuthorizeAsync(authorizationData).ConfigureAwait(false);

    if (authorizationSuccessful)
    {
        navigationManager.NavigateTo("/portal", true);
    }
    else
    {
        throw new UnauthorizedAccessException("Incorrect login or password");
    }
}

Итак, проблема в том, что:
При прохождении авторизации (authorizationSuccessful равно true) и выполнении навигации я попадаю на страницу / portal без каких-либо данных авторизации, поэтому я get 401 Unauthorized error.

Вопрос в следующем:

Как передать полученный токен-носитель (accessToken) через NavigateTo метод в Authorization HTTP-заголовок в правомерное завершение sh доступ к странице '/ portal'? Это вообще возможно?

1 Ответ

0 голосов
/ 11 марта 2020

К сожалению, невозможно выполнить sh эту задачу таким образом.

Согласно попыткам сделать что-то подобное, используя только JS ( this и это ), это невозможно сделать с обычным JS.

Так что у нас есть всего несколько вариантов:

Обмен токеном авторизации через куки

Файлы cookie являются общим хранилищем на основе браузера, поэтому проверить токен доступа можно здесь сразу после навигации.

Отправка токена авторизации через запрос

NavigateTo метод может использоваться с параметрами запроса например:

navigationManager.NavigateTo($"/portal?token={accessToken}", true);

Таким образом, мы можем проверить токен доступа непосредственно из параметров запроса.

...