Какую безопасность API использовать для внешнего API, используемого Blazor WASM - PullRequest
1 голос
/ 28 мая 2020

Контекст: у вас работает 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, а добавить еще одного типизированного клиента невозможно, поскольку я не могу дать ему другое имя?

...