Контекст: у вас работает API с простым вызовом / auth, который ожидает адрес электронной почты, пароль и какой-то идентификатор базы данных. Что затем возвращает токен JWT. Этот токен можно использовать для запроса других вызовов и определения базы данных для доступа. Теперь клиент находится в UWP, который обрабатывает пользовательский интерфейс и выполняет вызовы API. На данный момент не используется Azure Api Management и не используется платформа Microsoft Identity. Просто обычный пароль ha sh check.
Недавно мы хотели переключиться с UWP на Blazor WASM (только клиент), но пока не нашли подходящей поддержки для работы с токенами Bearer и документацией. нам предстояло четыре варианта.
- AAD
- AAD B2 C
- Учетные записи Microsoft
- Библиотека аутентификации (?)
Не У всех наших пользователей есть учетные записи Office 365.
В этом новом «пространстве Blazor» все немного потеряно, поскольку оно сильно отличается от наших проектов WPF и UWP и, похоже, еще не полностью задокументировано.
Спасибо.
Код обновления по запросу
Program.cs
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
// Local storage access
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddTransient<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddTransient<IAccessTokenProvider, ApiTokenProvider>();
builder.Services
.AddHttpClient<IMambaClient, MambaClient>(client => client.BaseAddress = _baseUri)
.AddHttpMessageHandler(sp => sp.GetRequiredService<BaseAddressAuthorizationMessageHandler>()
.ConfigureHandler(new[] { _apiEndpointUrl }));
await builder.Build().RunAsync();
}
ApiTokenProvider.cs
public class ApiTokenProvider : IAccessTokenProvider
{
private readonly ILocalStorageService _localStorageService;
public ApiTokenProvider(ILocalStorageService localStorageService)
{
_localStorageService = localStorageService;
}
public async ValueTask<AccessTokenResult> RequestAccessToken()
{
var token = await _localStorageService.GetItemAsync<string>("Token");
AccessTokenResult accessTokenResult;
if (!string.IsNullOrEmpty(token))
{
accessTokenResult = new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken() { Value = token, Expires = new DateTimeOffset(DateTime.Now.AddDays(1)) }, "/");
}
else
{
accessTokenResult = new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, new AccessToken() { Value = token, Expires = new DateTimeOffset(DateTime.Now.AddDays(1)) }, "/login");
}
return await new ValueTask<AccessTokenResult>(accessTokenResult);
}
public ValueTask<AccessTokenResult> RequestAccessToken(AccessTokenRequestOptions options)
{
throw new NotImplementedException();
}
}
Новый вопрос : Как я могу сейчас вызвать POST / auth, если это сработает? Я бы получил сообщение об ошибке, так как у меня еще нет токена для этого TypedClient, а добавить еще одного типизированного клиента невозможно, поскольку я не могу дать ему другое имя?