Предоставление IdentityServer4 ключа для службы приложений Linux - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь настроить IdentityServer4 в приложении netcore 3.1, работающем в службе приложений Linux (B1). Я пытаюсь загрузить ключ из файловой системы и передать его IdentityServer во время настройки ( согласно здесь ), но ключ, который я предоставляю, кажется, выбрасывается, когда IdentityServer пытается найти конфигурацию чтобы найти сам ключ ( в строке 70, как представляется, исключение выдается из ).

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddIdentityServer()
            .AddSigningCredential(GetCert())
            .AddApiAuthorization<IdentityUser, ApplicationDbContext>();

        services.AddAuthentication()
            .AddIdentityServerJwt();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();
        app.UseIdentityServer(); // exception thrown here 
        app.UseAuthorization();
    }


    private X509Certificate2 GetCert()
    {
        // Linux App Service puts keys configured in the App Service in this directory
        // I have checked - the key is correctly placed here
        var bytes = System.IO.File.ReadAllBytes("/var/ssl/private/XYZTHUMBPRINTXYZ.p12");
        return new X509Certificate2(bytes);
    }

Я должен отметить, что на самом деле не проблема получить ключ на Azure или в самом приложении, я проверил его в файловой системе, и приложение может создать из него действительный ключ, просто IdentityServer просто отбрасывает его.

Поскольку тип хранилища ключей Windows недоступен в сервисе Linux конфигурация appsettings (пример ниже) не работает.

  "IdentityServer": {
    "Key": {
      "Type": "Store",
      "StoreName": "My",
      "StoreLocation": "CurrentUser",
      "Name": "CN=example.com"
    }   
  },

1 Ответ

1 голос
/ 24 января 2020

Я дошел до сути вопроса с помощью ответа на этот вопрос - Не удается добавить аутентификацию Identityserver в net ядро ​​3 приложения с «Тип ключа не указан».

Проблема в том, что AddApiAuthorization<IdentityUser, ApplicationDbContext>() внутренне выполняет вызов AddSigningCredentials(), который будет инструктировать IdentityServer искать в конфигурации приложения, чтобы выяснить, какие ключи использовать. Он будет делать это независимо от того, вызывается ли AddSigningCredential(cert) до или после.

Чтобы решить мою проблему, я добавил метод AddApiAuthorization<IdentityUser, ApplicationDbContext>() и удалил строку, которая искала дополнительные ключи в конфигурации, и теперь приложение работает на linux appservice.

Я также задал вопрос о github IdentityServer, оставив ссылку на случай, если владельцы проекта прокомментируют решение - https://github.com/IdentityServer/IdentityServer4/issues/4000

...