Identityserver4 - 在IIS中托管

问题描述:

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

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

1。要首先在本地主机上测试这个,确保你使用的是“AddSigningCredential”而不是“AddTemporarySigningCredential”。

services.AddIdentityServer() 
        .AddSigningCredential(new X509Certificate2(Path.Combine(_environment.ContentRootPath, "certs", "IdentityServer4Auth.pfx"))); 
        //.AddTemporarySigningCredential() 
; 
  1. 在项目中创建的证书(创建的证书文件夹),在Visual Studio命令运行以下命令:
  2. “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

    1. 试验在localhost

    2. 如果成功,部署通过双击iis服务器,在服务器上安装证书并进行测试。

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

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

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

    开始=>
开始=>
+0

感谢@DavidSmit的解释,我也跟着: - 确保应用程序池“加载用户配置文件”设置为true: 转到IIS管理器 转到应用程序池实例 点击高级设置 在流程模型,将“加载用户配置文件”设置为true 重新启动IIS –

一个小的背景,为什么它正在你的本地开发计算机上并在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")));