WindowsCryptographicException: доступ запрещен при публикации приложения в Azure

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

Приложение хорошо работает в моей среде разработки (база данных находится в Azure, но приложение работает на моем компьютере). Однако я опубликовал его в Azure только для того, чтобы посмотреть, работает ли он после размещения в облачном провайдере, и действительно ли он возвращает ошибку и не запускается. Это трассировка стека:

Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Access is denied.
   at Internal.Cryptography.Pal.StorePal.FromSystemStore(String storeName, StoreLocation storeLocation, OpenFlags openFlags)
   at System.Security.Cryptography.X509Certificates.X509Store.Open(OpenFlags flags)
   at Microsoft.Extensions.DependencyInjection.OpenIddictServerBuilder.AddDevelopmentEncryptionCertificate(X500DistinguishedName subject)
   at Microsoft.Extensions.DependencyInjection.OpenIddictServerBuilder.AddDevelopmentEncryptionCertificate()
   at MyApp.Api.Startup.<>c.<ConfigureServices>b__4_4(OpenIddictServerBuilder options) in C:\Users\edm\OneDrive\MyAp\1\1\MyApp.Api\Startup.cs:line 75
   at Microsoft.Extensions.DependencyInjection.OpenIddictServerExtensions.AddServer(OpenIddictBuilder builder, Action`1 configuration)
   at MyApp.Api.Startup.ConfigureServices(IServiceCollection services) in C:\Users\edm\OneDrive\MyApp\1\1\MyApp.Api\Startup.cs:line 54
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.<Invoke>g__Startup|0(IServiceCollection serviceCollection)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.<Build>b__0(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass12_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
   at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at MyApp.Api.Program.Main(String[] args) in C:\Users\edm\OneDrive\MyApp\1\1\MyApp.Api\Program.cs:line 16

Я очень ценю любую помощь. Я новичок в OpenId, поэтому, если это слишком простой вопрос и есть другие ресурсы, которые я должен прочитать в первую очередь, не стесняйтесь делиться ссылками.

Спасибо!

Ed


person Ed M.    schedule 21.05.2021    source источник
comment
Оформить заказ этот пост на форумах MSDN, кажется, кто-то мог решить именно эту ошибку. магазин еще не создан   -  person DekuDesu    schedule 21.05.2021
comment
Это сообщение на SO также может предоставить некоторый контекст того, почему у вас возникли проблемы с azure.   -  person DekuDesu    schedule 21.05.2021
comment
Спасибо за ссылки. Я скоро вернусь.   -  person Ed M.    schedule 22.05.2021


Ответы (2)


  1. Добавьте параметр приложения WEBSITE_LOAD_USER_PROFILE=1 на портал.

    Если не работает, попробуйте второй способ.

  2. Добавьте СЕРТИФИКАТЫ в свое веб-приложение.

    Отправить сертификат в службу приложений

person Jason Pan    schedule 21.05.2021
comment
Спасибо. Мое сегодняшнее расследование также привело меня к настройке WEBSITE_LOAD_USER_PROFILE. Я до сих пор точно не знаю, как создавать сертификаты, но эта проблема из проекта OpenIddict также предлагает некоторые решения. Буду держать вас в курсе. github.com/openiddict/openiddict-core/issues/976 - person Ed M.; 22.05.2021
comment
@ЭдМ. Вы можете создавать самоподписанные сертификаты с помощью PowerShell. - person Jason Pan; 23.05.2021

Большое спасибо за все ссылки. Я продолжил расследование. В [ссылке, которой я поделился ранее][1] Кевин Шале, ведущий участник OpenIddict, прямо упомянул, что не следует использовать образец кода, когда речь идет о сертификатах, и предложил создать собственный.

Поэтому я научился создавать самозаверяющие сертификаты с помощью Powershell благодаря курсу Троя Ханта по Pluralsight. Забавно, что Джейсон указал мне в том же направлении в своем комментарии (@Jason, большое спасибо, я пока не могу проголосовать за вас, так как у меня недостаточно репутации/очков, но я сделаю это, когда мне разрешат).

Вот как это сделать, для справки:

PS> New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname example.mysite.com

При выполнении он выведет отпечаток и тему нашего сертификата.

PS> $pwd = ConvertTo-SecureString -String "WHATEVERPASSWORDYOUWANT" -Force -AsPlainText

Вы определяете переменную $pwd, которую мы будем использовать для экспорта сертификата, с помощью этой команды:

PS> Export-PfxCertificate -cert cert:\localMachine\my\THE_THUMBPRINT_YOU_GOT_EARLIER -FilePath "YOUR_PATH\cert.pfx" -Password $pwd

Затем я мог загрузить этот сертификат в службу приложений, как ответил Джейсон выше, а затем в моем коде мне пришлось изменить свой класс запуска, изменив значение по умолчанию

options.AddDevelopmentEncryptionCertificate().AddDevelopmentSigningCertificate();

to

options.AddEncryptionCertificate("THE_THUMBPRINT_YOU_GOT_EARLIER").AddSigningCertificate("THE_THUMBPRINT_YOU_GOT_EARLIER");

И последнее, что нужно было сделать, это добавить этот параметр приложения в приложение Azure:

WEBSITE_LOAD_CERTIFICATES с отпечатком сверху в качестве значения.

Примечание. Чтобы иметь возможность загрузить частный сертификат (pfx) в Azure, вам необходимо иметь как минимум базовый уровень в плане службы приложений.

Спасибо всем [1]: https://github.com/openiddict/openiddict-core/issues/976

person Ed M.    schedule 24.05.2021