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 身份验证和身份?