【问题标题】:Identityserver4 - Hosting in IISIdentityserver4 - 在 IIS 中托管
【发布时间】:2017-07-10 03:05:05
【问题描述】:

如何在 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 ---

我该如何解决这个问题?

【问题讨论】:

  • 在服务器中安装 X509Certificate 后,一切正常。感谢 Jeffrey T. Fritz 的以下文章帮助我解决了blogs.msdn.microsoft.com/webdev/2016/10/27/…
  • 嗨@Arun。在我的测试服务器(www)上,我也遇到了与您相同的问题。所以我在本地 PC 上使用 Visual Studio 命令创建了一个自签名的“*.pfx”证书,然后使用“AddSigningCredential”将其添加到身份中,这在 localhost 上运行良好。但是在测试服务器(www)上,我现在收到 500 错误,根本没有日志。您是如何为您的站点创建/获取 *.pfx 证书的? (复制它对我不起作用,或者使用 IIS 创建一个 pfx)
  • 查看进程正在运行的用户,然后以该用户身份登录以允许windows自动为该用户生成私钥,请参阅下面我的解决方案和说明

标签: core identityserver4


【解决方案1】:

正如 Arun 在他的评论中指出的,证书必须安装在服务器上。

1 .要首先在 localhost 上进行测试,请确保您使用的是“AddSigningCredential”而不是“AddTemporarySigningCredential”。

services.AddIdentityServer()
                    .AddSigningCredential(new X509Certificate2(Path.Combine(_environment.ContentRootPath, "certs", "IdentityServer4Auth.pfx")));
                    //.AddTemporarySigningCredential()
 ;
  1. 在您的项目中创建证书(创建证书文件夹),在 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\x64\pvk2pfx" -pvk IdentityServer4Auth.pvk -spc IdentityServer4Auth.cer -pfx IdentityServer4Auth.pfx

  1. 在本地主机上测试

  2. 如果成功,部署到iis服务器,在服务器上双击安装证书,然后测试。

  3. 确保应用程序池“加载用户配置文件”设置为 true:

    • 转到 IIS 管理器
    • 转到应用程序池实例
    • 点击高级设置
    • 在进程模型下,将加载用户配置文件设置为 true
  4. 重启 IIS

  5. 如果失败并返回 500,就像我一样(并且没有日志可以帮助您),试试这个。要解决此问题,请按照与步骤 2 中的 certs 文件夹中相同的方式在服务器上重新创建证书。双击要安装的证书。 如果您没有安装 Visual Studio,您可能需要安装开发人员工具包: https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk

【讨论】:

  • 谢谢@DavidSmit,我关注了:-确保应用程序池“加载用户配置文件”设置为true:转到IIS管理器转到应用程序池实例单击高级设置在进程模型下,设置加载用户配置文件为 true 重启 IIS
【解决方案2】:

首先介绍一下背景知识,说明为什么它可以在本地开发计算机上运行,​​而不是在 QA 或生产环境的 IIS 下运行。如果您在添加服务 Identity Server 4 时使用临时签名凭据,

services.AddIdentityServer().AddTemporarySigningCredential();

然后您必须确保“进程”正在运行的“用户”具有可供 ID4 使用的私钥来创建临时证书。这就是为什么错误消息是

SignatureProvider,'key.HasPrivateKey' 为假,无法创建 签名。密钥:Microsoft.IdentityModel.Tokens.RsaSecurityKey。

对于 Windows,此私钥由 Windows 自动生成,可以在用户的​​ %APPDATA%\Microsoft\Crypto\RSA 文件夹或 C:\ 中找到用户\用户名\AppData\Roaming\Microsoft\Crypto\RSA。缺少此私钥的原因可能是因为您的进程正在运行的用户从未登录到该计算机。

在这种情况下,可能的解决方案是以将在该服务器上运行进程的用户身份登录一次。如果您在 IIS 中的应用程序池作为具有非常高权限的“非服务”用户运行并且该用户从未以交互方式登录到服务器本身,则私钥目录丢失是很常见的。这也解释了为什么“localhost”可以在您的开发计算机上运行,​​而在生产或 QA 服务器上运行时可能无法运行。

有关 Windows 如何以及在何处为用户创建私钥的更多信息可以在此链接中找到Microsoft Key Storage and Retrieval. 此外,正如 David Smit 所提到的,建议明确指定私钥文件,而不是使用临时签名证书。如果允许您更改代码,这是更简洁的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多