Минимальные API в Blazor с RequireAuthorization() с использованием индивидуальной учетной записиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Минимальные API в Blazor с RequireAuthorization() с использованием индивидуальной учетной записи

Сообщение Anonymous »

В моем проекте .NET 8 Blazor я добавил «Индивидуальную учетную запись» для управления пользователями. Приложение имеет 2 проекта.
Сервер
Серверная часть содержит часть входа и контроллеры/конечные точки.
Изображение

Контроллеры/конечные точки представляют собой минимальные API вот такой

Код: Выделить всё

public static void MapClientEndpoints (this IEndpointRouteBuilder routes)
{
var group = routes.MapGroup("/api/Client").WithTags(nameof(Client));

group.MapGet("/", async (HypnoContext db) =>
{
return await db.Client.ToListAsync();
})
.RequireAuthorization()
.WithName("GetAllClients")
.WithOpenApi();
}
для сохранения в базе данных. Также я добавил конфигурацию для HttpClient:

Код: Выделить всё

builder.Services.AddScoped();

builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();

builder.Services.AddIdentityCore(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles()
.AddEntityFrameworkStores()
.AddSignInManager()
.AddDefaultTokenProviders();

builder.Services
.AddScoped(sp => sp
.GetRequiredService()
.CreateClient("ServerAPI"))
.AddHttpClient("ServerAPI", (provider, client) =>
{
client.BaseAddress = new Uri(builder. Configuration["FrontendUrl"]);
});
Клиент
Клиентский проект имеет все представления. Представления вызывают API, предоставляемые сервером.
Изображение

В Program.cs эта конфигурация добавляется «из коробки»:

Код: Выделить всё

builder.Services.AddSingleton();
Чтобы подключиться к API со страниц, я создал класс для группировки всех вызовов в одном месте. Конструктор это

Код: Выделить всё

string baseEndpoint;
IHttpClientFactory ClientFactory;
HttpClient? httpClient;

public ApiService(string baseUrl, IHttpClientFactory clientFactory)
{
baseEndpoint = baseUrl;
ClientFactory = clientFactory;
httpClient = ClientFactory.CreateClient("ServerAPI");
}
Хотя я вхожу в приложение как пользователь, вызовы API работают только в том случае, если в Minimal API не требуется авторизация. Это похоже на то, что IHttpClientFactory не имеет
Как защитить API и использовать их на стороне клиента?
Что я пробовал
В Program.cs сервера я добавил этот код для HttpClient:

Код: Выделить всё

builder.Services.AddScoped();

builder.Services.AddHttpClient("ServerAPI", client => {
client.BaseAddress = new Uri(builder.Configuration["FrontendUrl"]);
})
.AddHttpMessageHandler();

builder.Services.AddTransient(sp =>
sp.GetRequiredService().CreateClient("ServerAPI"));
CustomAuthorizationMessageHandler выглядит следующим образом

Код: Выделить всё

public class CustomAuthorizationMessageHandler : AuthorizationMessageHandler
{
public CustomAuthorizationMessageHandler(IAccessTokenProvider provider,
NavigationManager navigationManager)
: base(provider, navigationManager)
{
ConfigureHandler(
authorizedUrls: new[] { "https://localhost:7241" });
}
}
Я делаю это, потому что хочу выполнять вызовы API, представленные в серверном проекте, защищенном индивидуальной учетной записью. Итак, на странице

Код: Выделить всё

@inject HttpClient httpClient

HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Get, "/api/Client");
await httpClient.SendAsync(request);
При запуске приложения я сразу получаю сообщение об ошибке:

System.AggregateException: «Некоторые службы не может быть
создан (Ошибка при проверке дескриптора службы
'ServiceType: MyApp.CustomAuthorizationMessageHandler
Lifetime: Scoped ImplementationType:
MyApp.CustomAuthorizationMessageHandler': невозможно разрешить
службу для типа
'Microsoft.AspNetCore.Components.WebAssembly.Authentication.IAccessTokenProvider'
при попытке активировать
'MyApp.CustomAuthorizationMessageHandler '.)'

Изображение


Подробнее здесь: https://stackoverflow.com/questions/792 ... al-account
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»