Почему мой проект Blazor не может правильно использовать MyProj.HttpApi.Client? - PullRequest
0 голосов
/ 11 января 2020

Я использовал ABP CLI сгенерировал шаблон MVC, с которым я хотел бы попробовать проект Blazor Server . Я добавляю модуль MyProjBlazorModule, который был таким же, как и у всех распространенных модулей, точно так же, как проект ConsoleTestApp :

namespace MyProj.Blazor
{
    [DependsOn(
        typeof(MyProjHttpApiClientModule),
        typeof(AbpHttpClientIdentityModelModule)
        )]
    public class MyProjBlazorModule : AbpModule
    {
    }
}

Затем я добавил модуль как службу в ConfigureServices method:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSyncfusionBlazor();
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSingleton<WeatherForecastService>();
        services.AddApplication<TaurusBlazorModule>();

    }

для быстрого теста, я также скопировал ClientDemoService класс из шаблона проекта MyProj.HttpApi.Client.ConsoleTestApp , и я использую его в мой index.razor, как это:

@inject ClientDemoService _clientService
...
protected override async Task OnInitializedAsync()
{

    await base.OnInitializedAsync();
    profile = await _clientService.RunAsync();
}

Но это не могло работать, с сообщением об ошибке в браузере:

InvalidOperationException: не был указан AuthenticationScheme, и не было найдено DefaultAuthenticateScheme. Схемы по умолчанию могут быть установлены с использованием AddAuthentication (строка defaultScheme) или AddAuthentication (Action configureOptions).

, в то время как если я копирую код, идентичный консольному тестовому проекту, например:

        using (var application = AbpApplicationFactory.Create<MyProjConsoleApiClientModule>())
        {
            application.Initialize();

            var demo = application.ServiceProvider.GetRequiredService<ClientDemoService>();
            profile = AsyncHelper.RunSync(() => demo.RunAsync());

        }

и все заработало. Я хотел бы знать разницу между использованием модуля ABP и явным вызовом здесь уродливого метода ServiceProvider, и как я могу исправить эту проблему некоторым правильным и красивым способом?

Спасибо за помощь всем!

1 Ответ

0 голосов
/ 18 января 2020

Наконец-то я понял, что с этим не так. В исходном коде шаблона из abp CLI , метод ConfigureAuthentication метода MyProjHttpApiHostModule *1004* регистрирует службу аутентификации следующим образом:

    private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
    {
        context.Services.AddAuthentication()
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.ApiName = "MyProj";
                options.JwtBackChannelHandler = new HttpClientHandler()
                {
                    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
                };
            });
    }

, где используется метод AddAuthentication () пусто параметр перегрузка, которая вызвала ошибку Не указана схема аутентификации . Я сослался на IdentityServer4 официальный документ и нашел правильный способ сделать:

context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(options =>
            {
                ...
            });

Это просто, мне нужно установить схему по умолчанию JwtBearerDefaults.AuthenticationScheme , используя другую перегрузку метода AddAuthentication, как и сообщалось об ошибке.

Я надеюсь, что этот пост может помочь кому-то, сталкивающемуся с той же или похожей проблемой.

...