如何在IIS中使用IdentityServer4托管ASPNET CORE APP。该应用程序从localhost运行正常,但不是IIS中的Web应用程序设置。
例如,
http://localhost:5000/connect/token正在运行,但无法访问http://example.com/myauthapp/connect/token - 使用身份模型或邮递员从控制台应用程序尝试时返回500 - 内部服务器错误。我可以使用网络浏览器登录该应用程序,但不能通过控制台应用程序或邮递员登录。
进一步排查问题,我找到了以下内容。
An unhandled exception has occurred: IDX10638: Cannot created the SignatureProvider, 'key.HasPrivateKey' is false, cannot create signatures. Key: Microsoft.IdentityModel.Tokens.RsaSecurityKey.
System.InvalidOperationException: IDX10638: Cannot created the SignatureProvider, 'key.HasPrivateKey' is false, cannot create signatures. Key: Microsoft.IdentityModel.Tokens.RsaSecurityKey.
at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(SecurityKey key, String algorithm, Boolean willCreateSignatures)
at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.CreateEncodedSignature(String input, SigningCredentials signingCredentials)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken(SecurityToken token)
at IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync(JwtSecurityToken jwt)
at IdentityServer4.Services.DefaultTokenCreationService.<CreateTokenAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
我该如何解决这个问题?
答案 0 :(得分:5)
正如Arun在评论中指出的那样,证书必须安装在服务器上。
1。要首先在localhost上测试它,请确保使用&#34; AddSigningCredential&#34;不是&#34; AddTemporarySigningCredential&#34;。
services.AddIdentityServer()
.AddSigningCredential(new X509Certificate2(Path.Combine(_environment.ContentRootPath, "certs", "IdentityServer4Auth.pfx")));
//.AddTemporarySigningCredential()
;
&#34; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ bin \ x64 \ makecert&#34; -n &#34; CN = IdentityServer4Auth&#34; -a sha256 -sv IdentityServer4Auth.pvk -r IdentityServer4Auth.cer -b 01/01/2017 -e 01/01/2025
&#34; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ bin \ x64 \ pvk2pfx&#34; -pvk IdentityServer4Auth.pvk -spc IdentityServer4Auth.cer -pfx IdentityServer4Auth.pfx
在localhost上测试
如果成功,请部署到iis服务器,双击服务器在服务器上安装证书,然后进行测试。
确保应用程序池&#34;加载用户个人资料&#34;设置为true:
重新启动IIS
如果这与500失败,就像我一样(并且没有日志可以帮助你),试试这个。要解决此问题,请在certs文件夹中的步骤2中重新创建服务器上的证书。双击要安装的证书。 如果您没有安装Visual Studio,则可能必须安装开发人员工具包: https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk
答案 1 :(得分:1)
首先介绍一下,为什么它在您的本地开发计算机上工作,而不是在QA或生产环境下的IIS下运行。如果您在添加服务Identity Server 4时使用临时签名凭据,
services.AddIdentityServer().AddTemporarySigningCredential();
然后你必须确保&#34; 用户&#34; &#34; 流程&#34;正在运行,因为有一个私钥可用于ID4创建临时证书。这就是错误消息
的原因SignatureProvider,&#39; key.HasPrivateKey&#39;是假的,无法创建 签名。密钥:Microsoft.IdentityModel.Tokens.RsaSecurityKey。
对于Windows,此私钥由Windows自动生成,可以在用户的%APPDATA%\ Microsoft \ Crypto \ RSA 文件夹中找到,或者 C:\ Users \用户名\应用程序数据\漫游\微软\加密\ RSA 即可。缺少此私钥的原因可能是因为您的进程正在运行的用户从未登录过该计算机。
在这种情况下,可能的 SOLUTION 是作为将在该服务器上运行Process的用户登录一次。如果IIS中的应用程序池作为非服务&#34;运行,那么私钥目录很常见。具有非常高权限的用户,该用户从未以交互方式登录到服务器本身。这也解释了为什么&#34; localhost &#34;适用于您的开发计算机,而在生产或QA服务器上运行可能不会。
有关Windows如何以及在何处为用户创建私钥的详细信息,请参见此链接Microsoft Key Storage and Retrieval.此外,建议David Smit提及明确指定私钥文件,而不是使用临时签名凭证。如果允许您进行代码更改,这是更清晰的解决方案。
services.AddIdentityServer()
.AddSigningCredential(new X509Certificate2("C:\Certs\IdentityServer4PrivateKeyFile.pfx")));