Размещено приложение Blazor Web Assembly .Net Core: ошибка выполнения публикации

Я создал простой проект веб-сборки Blazor, размещенный в приложении .NET Core с использованием .NET 5.0 RC1 Framework, и добавил авторизацию во время работы мастера в Visual Studio 2019 Preview. Он отлично работает при отладке, но если я публикую его и пытаюсь подключиться к серверу, я получаю ошибку 500. При проверке журналов ошибка:

Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HM37MQFV38CV", Request id "0HM37MQFV38CV:00000003": An unhandled exception was thrown by the application.
      System.NullReferenceException: Object reference not set to an instance of an object.
         at Microsoft.Extensions.DependencyInjection.IdentityServerBuilderConfigurationExtensions.<>c.<AddSigningCredentials>b__10_2(IServiceProvider sp)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitNoCache(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
         at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
         at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
         at Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.AuthenticateAsync(HttpContext context, String scheme)
         at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
         at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
         at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.HandleException(HttpContext context, ExceptionDispatchInfo edi)
         at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
         at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Я думаю, что проблема связана с Identity Server и сертификатом, но я не понимаю, что именно.

Любые идеи?

Спасибо.


person Giuseppe Terrasi    schedule 03.10.2020    source источник


Ответы (2)


При использовании файла .pfx возникла следующая ошибка:

Blazor - app.UseIdentityServer (); с файлом ключа .pfx - при анализе числа обнаружен непредвиденный символ

Я наконец решил это так:

Создал новый сертификат в Powershell от имени администратора:

New-SelfSignedCertificate -DnsName "blazortest" -CertStoreLocation "cert:\CurrentUser\My"

appsettings.json:

  "IdentityServer": {
    "Clients": {
      "BlazorTest.Client": {
        "Profile": "IdentityServerSPA"
      }
    },
    "Key": {
      "Type": "Store",
      "StoreName": "My",
      "StoreLocation": "CurrentUser",
      "Name": "CN=blazortest"
    }
  },

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.0#example-deploy-to-azure-app-service

Это работало локально. Затем я использовал mmc.exe для экспорта сертификата в виде файла .pfx и загрузил его через Azure App Service - ›TLS/SSL settings.

введите описание изображения здесь

Затем я использовал Azure Cloud Shell, чтобы разрешить доступ к сертификату следующим образом:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>

https://docs.microsoft.com/en-us/azure/app-service/configure-ssl-certificate-in-code#load-the-certificate-in-code

Вы также можете добавить Certificate Thumbprint вручную, добавив WEBSITE_LOAD_CERTIFICATES к Configuration:

введите описание изображения здесь

Тогда это наконец сработало!

Если вы получаете сообщение об ошибке от Azure Cloud Shell, например:

ResourceGroupNotFound: группа ресурсов "" не найдена.

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

az account show

az account list

az account set --subscription <subscriptionId>

Если вы размещаете на IIS, вам необходимо импортировать сертификат .pfx в папку Personal для Local Computer, а затем выбрать Manage Private Keys... и предоставить доступ пользователю, запускающему Application Pool.

введите описание изображения здесь

person Ogglas    schedule 02.03.2021
comment
Спасибо за этот полезный ответ. Как заставить его работать, используя сервер виртуального хостинга с сертификатом LetsEncrypt. Я публикую приложение с использованием веб-развертывания и панели управления Plesk для доступа к серверу хостинга. Я получаю сообщение об ошибке, что файлы модуля, отличные от JS, устарели после публикации. Если возможно, поделитесь настройкой ключа LetsEncrypt. - person Brijesh Kumar Tripathi; 12.05.2021
comment
@BrijeshKumarTripathi Спасибо! Вам нужен App Service plan как минимум на B1, чтобы использовать Custom domains / SSL. Когда он у вас есть, используйте Let's Encrypt Site Extension для получения автоматических обновлений. github.com/sjkp/letsencrypt-siteextension/wiki/How-to- установить - person Ogglas; 12.05.2021
comment
Спасибо за ваш быстрый ответ. Я не размещаю его на лазурном. Я размещаю его у другого поставщика услуг хостинга, и у меня есть сертификат LetsEncrypt для моего сайта. Я хочу знать, нужно ли мне явно настраивать его в appsettings.json. Мое приложение - это размещенное приложение Blazor Webassembly с Identity, а версия .NET - .NET 5. - person Brijesh Kumar Tripathi; 12.05.2021
comment
@BrijeshKumarTripathi Нет проблем! Нет - Let's Encrypt предназначен только для HTTPS и не имеет ничего общего с IdentityServer или вашим appsettings.json. - person Ogglas; 12.05.2021
comment
Это означает, что мне не нужно указывать настройки в appsettings.json, чтобы сертификат LetsEncrypt работал в производственной среде. Пожалуйста, поправьте меня, если я ошибаюсь. - person Brijesh Kumar Tripathi; 12.05.2021
comment
@BrijeshKumarTripathi Правильно, Let's Encrypt находится на уровне сервера для HTTPS. - person Ogglas; 12.05.2021
comment
Спасибо за вашу большую помощь, я получаю crbug / 1173575, файлы модулей, отличных от JS, устарели. ошибка при попытке запустить мое приложение после публикации его даже в локальной папке, но после применения настройки ключа, как было предложено вами, оно работает нормально из публикации в локальной папке. Я использую тот же blazortest для запуска публикации моей папки, но, пожалуйста, предложите, как запустить его на сервере с сертификатом LetsEncrypt. - person Brijesh Kumar Tripathi; 12.05.2021

Хорошо, я решил использовать этот вопрос / ответы

В производстве необходимо использовать сертификат, поэтому я создал самозаверяющий и добавил его путь в appsettings.json.

person Giuseppe Terrasi    schedule 03.10.2020