WindowsCryptographicException при запуске веб-приложения ASP.NET Core 2 в службе веб-приложений Azure - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь разместить веб-приложение ASP.NET Core 2 с помощью службы веб-приложений Azure.Веб-приложение отлично работает на моей машине для разработки (Windows 10).Он также работает на виртуальной машине Ubuntu 17.10, когда я публикую файлы.Однако при публикации веб-приложения из Visual Studio в Azure появляется следующее сообщение об ошибке:

WindowsCryptographicException: The system cannot find the file specified
    System.Security.Cryptography.CngKey.Open(string keyName, CngProvider provider, CngKeyOpenOptions openOptions)
    System.Security.Cryptography.CngKey.Open(string keyName, CngProvider provider)
    Internal.Cryptography.Pal.CertificatePal.GetPrivateKey<T>(Func<CspParameters, T> createCsp, Func<CngKey, T> createCng)
    Internal.Cryptography.Pal.CertificatePal.GetRSAPrivateKey()
    Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPrivateKey<T>(X509Certificate2 certificate, Predicate<X509Certificate2> matchesConstraints)
    ...
    Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
    Microsoft.AspNetCore.Server.IISIntegration.IISSetupFilter+<>c__DisplayClass3_0.<Configure>b__0(IApplicationBuilder app)
    Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter+<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder builder)
    Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
.NET Core 4.6.26212.01 X86 v4.0.0.0    |   Microsoft.AspNetCore.Hosting version 2.0.2-rtm-10011    |    Microsoft Windows 10.0.14393

Я сохраняю файл ключа в каталоге проекта и пытаюсь создать из него учетные данные.

После поиска я нашел следующие сайты, которые указывают на похожие решения: https://github.com/dotnet/corefx/issues/11042, https://github.com/IdentityServer/IdentityServer4/issues/1432, Сертификат не найден при развертывании IdentityServer 4 на Azure VM и CryptographicException было необработанным: система не может найти указанный файл

Это говорит о том, что мне нужно изменить настройки пула приложений и установить для параметра «Загрузить профиль пользователя» значение true и правильно установить разрешения дляфайл.Однако я не уверен, как это сделать с помощью Azure Portal .

Кроме того, вместо изменения файла на сервере существует решение, в котором можно добавить код либоProgram.cs или Startup.cs (приведенные ниже выдержки)?

Program.cs ( ссылка )

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseSetting("detailedErrors", "true")
            .UseIISIntegration()
            .UseStartup<Startup>()
            .CaptureStartupErrors(true)
            .Build();
}

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {   
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }
        app.UseStaticFiles();
        app.UseMvc();
    }
}

Заранее спасибо.

Обновление # 1

Приложение правильно развертывается.Я просто сталкиваюсь с ошибкой при выполнении следующего кода.

private static RSA GetPrivateKey(byte[] p12) {
    var certificate = new X509Certificate2(p12, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
    var rsa = certificate.GetRSAPrivateKey();
    return rsa;
}

Вот мой файл .csproj моего проекта:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="GDataDB" Version="1.0.0" />
        <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" />
    </ItemGroup>
    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
    </ItemGroup>
    <ItemGroup>
        <Folder Include="Pages\" />
        <Folder Include="Properties\PublishProfiles\" />
    </ItemGroup>
    <ItemGroup>
        <None Update="total-method-203123-88f147135d99.p12">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </None>
    </ItemGroup>
</Project>

Udpate # 2

Вот минимальное хранилище, которое демонстрирует ошибку: https://github.com/jonliew/testdatawebapp

Сначала я публикую GDataDB в пакет nuget, используя FolderProfile в Visual Studio.Затем я добавляю пакет в проект DataWebApp.Наконец, я публикую DataWebApp и получаю описанное выше поведение.

1 Ответ

0 голосов
/ 12 мая 2018

Скорее всего, проблема в том, что вы ориентируетесь на .NET Core 2.0.8, который еще не полностью развернут в службе приложений.См. здесь для объявления.

Чтобы проверить, действительно ли это проблема, попробуйте выполнить развертывание в тестовом веб-приложении в регионе West US 2 ( не Запад США), у которого есть релиз.Вы не должны получить ошибку там.

...