Не существует зарегистрированного сервиса типа «Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider». - PullRequest
0 голосов
/ 17 марта 2020

Пытаясь найти ответ на этот вопрос здесь: Как правильно реализовать серверный пользовательский авторизационный провайдер на стороне сервера Я обнаружил новую ошибку, которую не знаю, как ее решить. Взяв шаблон из комментария @Henk Holterman здесь: https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/ Я пытался выработать некоторое понимание того, как реализовать блэйзер веб-сборки и блейзер на стороне сервера, а также различия между ними.

Локально я могу запустить свой проект, и все работает как положено, я могу войти, зарегистрироваться и авторизовать пользователя. После развертывания приложения в IIS в консоли начинают появляться ошибки WASM, связанные с отсутствием зарегистрированной службы AuthenticationStateProvider.

При первом развертывании приложения в IIS у меня также возникли проблемы с файлом appsettings. json относительно раздел IdentityServer, и мне интересно, если я что-то сломал. Единственный раздел, который я добавил, был раздел «Ключ», потому что я получал ошибки, так как имя файла не определено. Это привело меня к сообщению stackoverflow здесь: IdentityServer4 не работает в рабочей среде , чтобы помочь разрешить проблему путем экспорта сертификата ssl для использования в качестве файла, который я затем включил в каталог своего проекта на IIS.

настройки приложений на стороне сервера. json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-BlazorApp3.Server-A7F1C813-7F5D-4B96-8663-B8FA2E1472E8;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
      "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
      }
    },
   "IdentityServer": {
    "Clients": {
      "BlazorApp3.Client": {
      "Profile": "IdentityServerSPA"
    }
   },
   "Key": {
      "Type": "File",
      "FilePath": "CertName.pfx",
      "Password": "CertPassword"
    }
  },
  "AllowedHosts": "*"
}

запуск на стороне сервера. Я включил здесь app.UsePathBase ("клиент-блейзер"), потому что в IIS мое приложение не находится на root узел. Это подузел сайта.

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging();

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));

        services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddIdentityServer()
            .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

        services.AddAuthentication()
            .AddIdentityServerJwt();

        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
            app.UseWebAssemblyDebugging();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UsePathBase("/client-side-blazor");

        app.UseHttpsRedirection();
        app.UseBlazorFrameworkFiles();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseIdentityServer();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("index.html");
        });
    }

клиентская веб-сборка blazor program.cs

public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");

        builder.Services.AddBaseAddressHttpClient();

        //builder.Services.AddAuthorizationCore();

        builder.Services.AddApiAuthorization();

        await builder.Build().RunAsync();
    }

builder.Services.AddAuthorizationCore () закомментирован выше, пытался следите за некоторыми другими сообщениями SO относительно моей текущей проблемы.

индекс клиента Blazor. html

<base href="/client-side-blazor/"/> 

В качестве примечания, все еще немного неясно, какой проект опубликовать sh при создании веб-сборки Blazor проекта. В ссылках на серверный проект есть клиентская dll, что заставляет меня думать, что я должен опубликовать sh серверный проект, но из документации я понимаю, что я также могу развернуть / publi sh только проект веб-сборки сам (может быть, как самостоятельный проект без аутентификации / авторизации). Любая дополнительная полезная информация, которую легко проглотить, будет принята с благодарностью.

Ссылки, которые я использовал до сих пор в своем исследовании:

https://docs.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-3.1

https://docs.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/standalone-with-authentication-library?view=aspnetcore-3.1

https://docs.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/hosted-with-identity-server?view=aspnetcore-3.1

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Чтобы решить эту проблему, я закрыл проект, удалил папку «obj», перезагрузил проект и все было хорошо.

H / T Джону Доверу, поскольку его ответ заставил меня вспомнить эту надоедливую папку .

0 голосов
/ 17 марта 2020

Хорошо, я решил попробовать пару вещей здесь. и хотел показать то, что я нашел, не загромождая комментарии.

Добавление services.AddAuthorizationCore () в startup.cs (и удалить папку .vs и перезагрузить проект) в серверном блейзоре отвечает на этот пост SO, но представляет новая проблема. Мой вопрос заключается в том, действительно ли это необходимо иметь в серверном проекте Blazor, потому что сайт, на котором я следовал, не добавил его. https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/

Во-вторых, я считаю, что настоящая проблема заключается в том, что я изменил базовый тег href. Если я создаю новый проект, меняю строку подключения и запускаю ее, все хорошо. Если я затем остановлю приложение, измените

<base href="/client-side-blazor/"/>

(включая конечный sla sh) в index. html и добавьте

app.UsePathBase("/client-side-blazor")

для запуска на сервере. cs, а затем повторно запустите приложение, оно больше не работает, как раньше. и звонки на контроллер прогнозирования погоды отвечают 401.

...