ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

Posted

技术标签:

【中文标题】ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败【英文标题】:ASP.NET Core Azure AD OpenID - Token Signature validation fails on production server 【发布时间】:2018-01-17 16:36:06 【问题描述】:

我有一个 ASP.NET Core 1.1 项目,使用 Azure AD OpenID 进行身份验证。身份验证在我的开发盒(Windows 10)上运行良好,在 IIS express 和完整 IIS 上。但是,当我将项目部署到我的服务器(Server 2008R2)时,在登录到 Microsoft 重定向站点后,服务器会抛出此错误:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:IDX10503:签名验证失败。尝试的密钥:'Microsoft.IdentityModel.Tokens.X509SecurityKey,KeyId:VWVIc1WD1Tksbb301sasM5kOq5Q Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException:发生内部错误 在 Internal.Cryptography.Helpers.OpenStorageProvider(CngProvider 提供者) 在 System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, String curveName, CngKeyBlobFormat 格式, CngProvider provider) 在 System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat 格式) 在 Internal.Cryptography.Pal.X509Pal.DecodePublicKey (Oid oid, Byte[] encodedKeyValue, Byte[] encodedParameters, ICertificatePal certificatePal) 在 Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPublicKey[T](X509Certificate2 证书,谓词`1 匹配约束) 在 Microsoft.IdentityModel.Tokens.X509SecurityKey.get_PublicKey() 在 Microsoft.IdentityModel.Tokens.CryptoProviderFactory.IsSupportedAlgorithm(字符串算法,SecurityKey 密钥) 在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(Byte[] encodedBytes, Byte[] 签名, SecurityKey key, String algorithm, TokenValidationParameters validationParameters) 在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(字符串令牌,TokenValidationParameters 验证参数)

当我从 Azure 收到令牌并将其插入 JWT.io 时,它会成功验证签名。

回顾一下:

开发盒(iis express 和 iis)令牌签名验证成功 JWT.io 调试站点,令牌和签名验证成功 部署在服务器 (iis 7.5) 签名验证失败

这和我在服务器上的 https 证书有什么关系吗?在我的开发盒上,我使用的是用 powershell 创建的自签名证书。在服务器上,我们有一个 go-daddy 颁发的证书。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

当“CNG 密钥隔离”Windows 服务未运行时,也会发生此异常。

见https://blogs.msdn.microsoft.com/dsnotes/2012/08/17/cngkey-import-throws-an-exception-saying-an-internal-error-occurred-when-importing-a-key-blob-under-a-non-admin-user-from-a-wcf-web-service/

【讨论】:

这让我免于多花几个小时挠头!谢谢你! 那篇文章的最后两句话是解决办法。【参考方案2】:

问题在于运行应用程序池的身份。权限不够高。

【讨论】:

您知道所需的权利吗?这会很有帮助。

以上是关于ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.2 中的 Azure AD 身份验证

ASP.NET Core 3.1 Azure AD 身份验证引发 OptionsValidationException

使用 Azure AD 的 Asp.net core mvc 基于角色的授权

如何在 ASP.NET Core 3 上同时使用 Azure AD 身份验证和身份?

ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息