2017-02-20 139 views
2

如何在IIS中使用IdentityServer4託管ASPNET CORE APP。該應用程序從本地主機運行良好,但不是在IIS中的Web應用程序設置。使用身份模型或通過郵遞員從一個控制檯應用程序試圖當內部服務器錯誤 -Identityserver4 - 在IIS中託管

例如

http://localhost:5000/connect/token是工作,但http://example.com/myauthapp/connect/token不可達 - 返回500。我可以使用網絡瀏覽器登錄到應用程序,但不能通過控制檯應用程序或郵遞員登錄。

進一步的故障排除,我找到下面。 發生未處理的異常:IDX10638:無法創建SignatureProvider,'key.HasPrivateKey'爲false,無法創建簽名。鍵:Microsoft.IdentityModel.Tokens.RsaSecurityKey。 System.InvalidOperationException:IDX10638:無法創建SignatureProvider,'key.HasPrivateKey'爲false,無法創建簽名。鍵:Microsoft.IdentityModel.Tokens.RsaSecurityKey。 在Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(SecurityKey鍵,字符串算法,布爾willCreateSignatures) 在Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey鍵,字符串算法,布爾willCreateSignatures) 在System.IdentityModel.Tokens .Jwt.JwtSecurityTokenHandler.CreateEncodedSignature(字符串輸入,SigningCredentials signingCredentials) 在System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken(SecurityToken令牌) 在IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync(JwtSecurityToken JWT) 在IdentityServer4.Services.DefaultTokenCreationService .d__3.MoveNext() ---上一個拋出異常的位置的堆棧跟蹤結束---

請告訴我該怎麼辦?

+0

在服務器中安裝X509Certificate後,所有工作正常。謝謝Jeffrey T. Fritz爲下面的文章幫助我解決了https://blogs.msdn.microsoft.com/webdev/2016/10/27/bearer-token-authentication-in-asp-net-core/ – Arun

+0

嗨@阿倫。我在測試服務器(www)上也遇到同樣的問題。所以我使用visual studio命令在本地PC上創建了一個自簽名的「* .pfx」證書,然後將其添加到「AddSigningCredential」身份,並且在localhost上正常工作。但在測試服務器(www)上,我現在得到一個500錯誤,根本沒有日誌。你是如何爲你的網站創建/獲得* .pfx證書的? (複製它沒有爲我工作,或者使用IIS創建一個pfx) –

+0

看看進程運行的用戶,然後以該用戶身份登錄,以允許窗口爲該用戶自動生成私鑰,查看我的解決方案及以下 – CodeCowboyOrg

回答

3

正如Arun在他的評論中指出的,證書必須安裝在服務器上。

1。要首先在本地主機上測試這個,確保你使用的是「AddSigningCredential」而不是「AddTemporarySigningCredential」。

services.AddIdentityServer() 
        .AddSigningCredential(new X509Certificate2(Path.Combine(_environment.ContentRootPath, "certs", "IdentityServer4Auth.pfx"))); 
        //.AddTemporarySigningCredential() 
; 
  • 在項目中創建的證書(創建的證書文件夾),在Visual Studio命令運行以下命令:
  • 「C:\ Program Files文件( x86)\ Windows Kits \ 8.1 \ bin \ x64 \ makecert「-n 」CN = IdentityServer4Auth「-a sha256 -sv IdentityServer4Auth.pvk -r IdentityServer4Auth.cer -b 01/01/2017 -e 01/01/2025

    「C:\ Program Files(x86)\ Windows Kits \ 8.1 \ BIN \ 64 \ pvk2pfx」 -pvk IdentityServer4Auth.pvk -spc IdentityServer4Auth.cer -pfx IdentityServer4Auth.pfx

  • 試驗在localhost

  • 如果成功,部署通過雙擊iis服務器,在服務器上安裝證書並進行測試。

  • 確保應用程序池「加載用戶配置文件」設置爲true:

    • 進入IIS管理器
    • 轉到應用程序池實例
    • 點擊高級設置
    • 在過程模型,將加載用戶配置文件設置爲true
  • 重新啓動IIS

  • 如果500失敗,就像我一樣(沒有日誌可以幫助你),試試這個。要解決此問題,請按照certs文件夾中步驟2中的相同方式在服務器上重新創建證書。雙擊要安裝的證書。 你可能有,如果你沒有安裝Visual Studio安裝開發工具包: https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk

  • +0

    感謝@DavidSmit的解釋,我也跟着: - 確保應用程序池「加載用戶配置文件」設置爲true: 轉到IIS管理器 轉到應用程序池實例 點擊高級設置 在流程模型,將「加載用戶配置文件」設置爲true 重新啓動IIS –

    1

    一個小的背景,爲什麼它正在你的本地開發計算機上並在QA IIS下不運行或生產環境。如果要添加服務的Identity Server 4的時候,像這樣,

    services.AddIdentityServer().AddTemporarySigningCredential(); 
    

    然後,你必須確保「用戶」的「過程」正在作爲擁有專用密鑰使用臨時簽名證書可用於ID4創建臨時證書。這就是爲什麼錯誤信息是

    SignatureProvider, 'key.HasPrivateKey' 是假的,不能創建 簽名。鍵:Microsoft.IdentityModel.Tokens.RsaSecurityKey。

    enter image description here

    在Windows的情況下,是由Windows自動生成該私鑰,可以在文件夾中找到%APPDATA%\微軟\加密\ RSA用戶或的C: \ Users \ Username \ AppData \ Roaming \ Microsoft \ Crypto \ RSA。此私鑰丟失的原因可能是因爲您的進程正在運行的用戶從未登錄過該計算機。

    可能的解決方案在這種情況下是作爲將在該服務器上運行進程的用戶登錄一次。如果IIS中的應用程序池作爲具有非常高權限的「非服務」用戶運行,並且該用戶從未以交互方式登錄到服務器本身,則私有密鑰目錄很常見。這也解釋了爲什麼「localhost」適用於您的開發計算機,而在生產或QA服務器上運行則可能不適用。在Windows上如何以及在哪裏創建用戶的私鑰

    的更多信息可以在這裏在這個環節Microsoft Key Storage and Retrieval.也可發現,推薦,而不是使用臨時簽名證書由大衛·斯密特提到明確指定私鑰文件, 。如果您允許更改代碼,那這就是更簡潔的解決方案。

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