#asp.net-core-webapi #blazor #blazor-client-side
#asp.net-core-webapi #blazor #blazor-на стороне клиента
Вопрос:
В настоящее время у меня есть ASP.Net Базовый веб-Api с Blazor WASM, который может успешно входить в Google OAuth с помощью компонента RemoteAuthenticatorView. Теперь я намерен передать токен, который у меня есть, в веб-api, который, надеюсь, можно использовать для аутентификации с помощью веб-api. Проблема в том, что TokenProvider .RequestAccessToken() выдает следующую ошибку.
blazor.webassembly.js:1 Microsoft.JSInterop.JSException: An exception occurred executing JS interop: The JSON value could not be converted to System.DateTimeOffset. Path: $.token.expires | LineNumber: 0 | BytePositionInLine: 88.. See InnerException for more details.
System.Text.Json.JsonException: The JSON value could not be converted to System.DateTimeOffset. Path: $.token.expires | LineNumber: 0 | BytePositionInLine: 88.
var tokenResult = await TokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", token.Value);
var response = await Http.SendAsync(requestMessage);
}
Program.cs
builder.Services.AddOidcAuthentication(options =>
{
builder.Configuration.Bind("Local", options.ProviderOptions);
options.ProviderOptions.DefaultScopes.Add("email");
});
Есть идеи? Отсутствует область видимости? Я вижу id_token в хранилище сеансов… Возможно, какой-нибудь net 5 пример Blazor WASM и core web api?
Редактировать: я вижу, что с помощью RequestAccessToken выполняется сетевой вызов для аутентификации Google, например, если бы он снова пытался пройти аутентификацию
Комментарии:
1. Не могли бы вы опубликовать содержимое файла appsettings.json, находящегося в папке wwwroot клиентского проекта.
2. {«Полномочия»: » accounts.google.com «, «Идентификатор клиента»: «3XXXXo1gn4loba5om5b4.apps.googleusercontent.com «, «PostLogoutRedirectUri»: » localhost: 44313/аутентификация / выход из системы-обратный вызов», «redirectUri»: » localhost:44313/аутентификация / вход-обратный вызов», «responseType»: «id_token»}
Ответ №1:
Создайте автономное приложение Blazor для веб-сборки с отдельными учетными записями.
Замените содержимое в файле appsettings.json следующим кодом:
{
"Google": {
"Authority": "https://accounts.google.com/",
"ClientId": "11111111111-11111111111111111111111111111111.apps.googleusercontent.com",
"DefaultScopes": [ "email" ], // The Blazor WebAssembly template automatically configures default scopes for openid and profile
"PostLogoutRedirectUri": "https://localhost:44313/authentication/logout-callback",
"RedirectUri": "https://localhost:44313/authentication/login-callback",
"ResponseType": "id_token token"
}
}
Запустите свое приложение и нажмите на ссылку для входа … Вы будете перенаправлены на страницу входа в Google. Аутентифицируйтесь с помощью Google…Вы перенаправляетесь в свое приложение, логин изменяется на выход из системы, и рядом с ним появляется ваше имя пользователя.
Вы можете просмотреть id_token и профиль с помощью инструментов разработчиков.
Как получить токен доступа?
Добавьте следующий фрагмент кода на свою индексную страницу и запустите…
@page "/"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
@inject IAccessTokenProvider TokenProvider
<p>@output</p>
<button @onclick="DisplayToken">Display Access Token </button>
@code
{
private string output;
private async Task DisplayToken()
{
var tokenResult = await TokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
output = token.Value;
}
}
}
Примечание: Приведенный выше код предназначен только для демонстрационных целей (после вашего примера кода). Однако, если вы выполняете HTTP-вызов своего веб-Api с использованием службы HttpClient, токен доступа автоматически извлекается и присваивается заголовку авторизации объектом AuthorizationMessagelHandler.
Комментарии:
1. @Jorge, не могли бы вы пометить его как ответ, если он решил вашу проблему, чтобы другие знали, что это было полезно.
2. Все правильно, спасибо. Я продолжу путешествие в следующие дни…
3. @enet У меня такая же проблема, но с Azure B2C вот мои настройки приложений.json { «AzureAdB2C»: { «Authority»: » testdomainb2ctest.b2clogin.com /… «, «ClientID»: «guidguid-guid-guid-guid-guid-guidguid», «ValidateAuthority»: false } } Я могу войти в систему нормально. Однако, когда я вызываю RequestAccessToken, появляется то же сообщение об ошибке, что и OP.