我正在尝试为我正在调查的WIF场景实现自定义STS,但它失败了。尝试从用于签名令牌的证书中获取私钥时失败。我使用以下配置创建STS:
var signingCert = new X509Certificate2(@"C:\<path>\MySigningCertificate.pfx");
var config
= new SecurityTokenServiceConfiguration()
{
DisableWsdl = true,
TokenIssuerName = "Tribold",
SecurityTokenService = typeof(TriboldSecurityTokenService),
SigningCredentials = new X509SigningCredentials(signingCert),
CertificateValidationMode = X509CertificateValidationMode.Custom,
CertificateValidator = new CertificateValidator()
};
但是,配置了WCF诊断日志记录后,我在服务跟踪查看器中收到以下消息:
The private key is not present in the X.509 certificate.
这似乎记录为代码来自我的自定义STS(即,在我的自定义STS类上调用GetOutputClaimsIdentity(...)
之后,因此我只能假设它现在正在尝试签署已颁发的安全令牌并且失败,因为它无法获得私钥。
私钥似乎出现在加载的证书上:
Debug.Assert(signingCert.HasPrivateKey == true);
但后来失败了。我没有运气解决这个问题,请帮忙!
答案 0 :(得分:1)
看起来日内瓦(= AD FS 2.0)论坛中的线程"cant use .pfx file for X.509 certificates"涵盖了您报告的同一问题。因此,报告的解决方案可能有效,即“在启动X509KeyStorageFlags.PersistKeySet
对象时指定X509Certificate2
标志”。
答案 1 :(得分:0)
如果您在打开PFX文件时不必指定密码,我会感到惊讶。 X509Certificate2 has overloads以字符串或SecureString的形式获取密码。