2017-02-20 3 views
2

Wie hostet ASPNET CORE APP mit IdentityServer4 in IIS. Die App läuft gut von localhost, aber nicht als eine Webanwendung in IIS eingerichtet.Identityserver4 - Hosting in IIS

Zum Beispiel

http://localhost:5000/connect/token arbeitet aber http://example.com/myauthapp/connect/token nicht erreichbar ist - Rückkehr 500 - Interner Serverfehler, wenn von einer Konsolenanwendung mit Identitätsmodell oder über Postbote versucht. Ich kann mich über einen Webbrowser in der App anmelden, aber nicht über eine Konsolenanwendung oder einen Postboten.

Weitere Problembehandlung und ich finde die folgenden. Eine nicht behandelte Ausnahme ist aufgetreten: IDX10638: Der SignatureProvider konnte nicht erstellt werden, "key.HasPrivateKey" ist false, Signaturen können nicht erstellt werden. Schlüssel: Microsoft.IdentityModel.Tokens.RsaSecurityKey. System.InvalidOperationException: IDX10638: Der SignatureProvider konnte nicht erstellt werden, "key.HasPrivateKey" ist false, Signaturen können nicht erstellt werden. Schlüssel: Microsoft.IdentityModel.Tokens.RsaSecurityKey. bei Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor (SecurityKey Schlüssel, String-Algorithmus, Boolean willCreateSignatures) bei Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider (SecurityKey Schlüssel, String-Algorithmus, Boolean willCreateSignatures) bei System.IdentityModel.Tokens .Jwt.JwtSecurityTokenHandler.CreateEncodedSignature (String-Eingang, SigningCredentials SigningCredentials) bei System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken (Security Token) bei IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync (JwtSecurityToken jwt) bei IdentityServer4.Services.DefaultTokenCreationService .d__3.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde ---

Bitte beraten, was ich tun soll?

+0

Nach der Installation von X509Certificate im Server funktioniert alles einwandfrei. Danke Jeffrey T. Fritz für den folgenden Artikel half mir zu lösen https://blogs.msdn.microsoft.com/webdev/2016/10/27/bearer-token-authentication-in-asp-net-core/ – Arun

+0

Hi @ Arun. Ich hatte auch das gleiche Problem wie du auf meinem Testserver (www). Also habe ich ein selbstsigniertes "* .pfx" -Cert mit dem Visual Studio-Befehl auf meinem lokalen PC erstellt und dann mit "AddSigningCredential" zur Identität hinzugefügt, und das funktioniert auf localhost einwandfrei. Aber auf dem Testserver (www) bekomme ich jetzt einen Fehler von 500, ohne Protokolle. Wie haben Sie ein * .pfx-Zertifikat für Ihre Website erstellt/erhalten? (kopieren Sie es über nicht funktioniert für mich, oder Erstellen eines pfx mit IIS entweder) –

+0

Blick auf den Benutzer, der der Prozess läuft als, dann einloggen als dieser Benutzer, damit Windows automatisch einen privaten Schlüssel für diesen Benutzer erzeugen, siehe meine Lösung und Erklärung unten – CodeCowboyOrg

Antwort

3

Wie Arun in seinem Kommentar bemerkte, muss das Zertifikat auf dem Server installiert werden.

1. Um dies zuerst auf localhost zu testen, stellen Sie sicher, dass Sie "AddSigningCredential" und nicht "AddTemporarySigningCredential" verwenden.

services.AddIdentityServer() 
        .AddSigningCredential(new X509Certificate2(Path.Combine(_environment.ContentRootPath, "certs", "IdentityServer4Auth.pfx"))); 
        //.AddTemporarySigningCredential() 
; 
  1. Erstellen Sie das Zertifikat in Ihrem Projekt (erstellen certs-Ordner), dieser Befehl in Visual Studio ausgeführt wird:

„C: \ Program Files (x86) \ Windows-Kits \ 8.1 \ bin \ x64 \ makecert "-n " CN = IdentitätServer4Auth "-a sha256 -sv IdentityServer4Auth.pvk -r IdentityServer4Auth.cer -b 01/01/2017 -e 01/01/2025

"C: \ Programme (x86) \ Windows Kits \ 8.1 \ bin \ x64 \ pvk2pfx“-pvk IdentityServer4Auth.pvk -spc IdentityServer4Auth.cer -pfx IdentityServer4Auth.pfx

  1. -Test auf localhost

  2. Wenn dies gelingt, bereitstellen Um den Server zu installieren, installieren Sie das Zertifikat auf dem Server, indem Sie darauf doppelklicken und testen.

  3. Sicherstellen, dass der Anwendungspool "load Benutzerprofil" auf true gesetzt ist:

    • Zum IIS-Manager
    • Zum Anwendungspool Instanz
    • Klicken Sie erweiterte Einstellungen
    • unter Prozess Modell, set Load User Profile auf true
  4. IIS neu starten

  5. Wenn dies mit einem 500 fehlschlägt, wie bei mir (und es gibt keine Protokolle, um Ihnen zu helfen), versuchen Sie dies. Um dies zu beheben, erstellen Sie das Zertifikat auf dem Server auf die gleiche Weise wie in Schritt 2 im Ordner "certs". Doppelklicken Sie auf das zu installierende Zertifikat. Möglicherweise müssen Sie die Entwickler-Kit installieren, wenn Sie Visual Studio installiert nicht haben: https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk

+0

Dank @DavidSmit, folgte ich: - Stellen Sie sicher, dass der Anwendungspool „load Benutzerprofil“ auf true gesetzt ist: zum IIS-Manager Gehen Sie auf die Anwendungspool Instanz erweiterte Einstellungen Klicken Sie unter Prozessmodell, Legen Sie Load User Profile auf True fest Starten Sie IIS neu –

1

Ein wenig Hintergrund erste, warum es auf Ihrem lokalen Entwicklung Computer arbeitet und nicht auf einem QA unter IIS ausgeführt wird oder Produktionsumfeld. Wenn Sie temporäres Signing Credential verwenden, wenn Sie den Dienst Identity Server 4 wie so hinzufügen,

services.AddIdentityServer().AddTemporarySigningCredential(); 

Dann müssen Sie sicherstellen, dass die „Benutzer“, dass der „Prozess“, wie läuft einen Privaten Key haben verfügbar für ID4, um ein temporäres Zertifikat zu erstellen. Aus diesem Grund wird die Fehlermeldung

SignatureProvider ist, 'key.HasPrivateKey' ist falsch kann Signaturen nicht erstellen. Schlüssel: Microsoft.IdentityModel.Tokens.RsaSecurityKey.

enter image description here

Im Falle von Windows, diese privaten Schlüssel von Windows generiert automatisch und anschließend im Ordner % APPDATA% \ Microsoft \ Crypto \ RSA des Benutzers oder C: \ Users \ Benutzername \ AppData \ Roaming \ Microsoft \ Crypto \ RSA. Der Grund, warum dieser private Schlüssel fehlt, liegt möglicherweise daran, dass der Benutzer, auf dem Ihr Prozess ausgeführt wird, sich noch nie bei diesem Computer angemeldet hat.

Die wahrscheinlich LÖSUNG in diesem Fall ist einmal als der Benutzer anmelden, der den Prozess auf diesem Server ausgeführt wird. Es ist durchaus üblich, dass das Private Key-Verzeichnis fehlt, wenn Ihr Anwendungspool in IIS als "Nicht-Service" -Benutzer mit sehr hohen Berechtigungen ausgeführt wird und dieser Benutzer sich nie interaktiv am Server angemeldet hat. Dies erklärt auch, warum "localhost" auf Ihrem Entwicklungscomputer funktioniert, während dies auf einem Produktions- oder QA-Server nicht möglich ist.

Weitere Informationen darüber, wie und wo Windows den privaten Schlüssel für einen Benutzer erstellt, finden Sie unter diesem Link Microsoft Key Storage and Retrieval. Außerdem wird empfohlen, wie von David Smit erwähnt, eine private Schlüsseldatei explizit zu verwenden, anstatt temporäre Anmeldeinformationen zu verwenden . Das ist die sauberere Lösung, wenn Sie Codeänderungen vornehmen dürfen.

services.AddIdentityServer() 
        .AddSigningCredential(new X509Certificate2("C:\Certs\IdentityServer4PrivateKeyFile.pfx")));