无法创建名称为 'http://www.w3.org/2000/09/xmldsig#hmac-sha1' 的算法
Cannot create algorithm with name 'http://www.w3.org/2000/09/xmldsig#hmac-sha1'
用户从 ADFS 成功验证后,我在某些服务器中遇到以下错误。
[ArgumentException: ID6037: Cannot create algorithm with name 'http://www.w3.org/2000/09/xmldsig#hmac-sha1'.
Parameter name: algorithm]
Microsoft.IdentityModel.Algorithms.NewDefaultEncryption() +170
Microsoft.IdentityModel.Web.RsaEncryptionCookieTransform.Encode(Byte[] value) +204
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +47
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(XmlWriter writer, SecurityToken token) +449 Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(SessionSecurityToken sessionToken) +84
Microsoft.IdentityModel.Web.SessionAuthenticationModule.WriteSessionTokenToCookie(SessionSecurityToken sessionToken) +123
....
它在我们的开发/暂存服务器中运行良好。但它在其他一些服务器和生产服务器上不起作用。我正在使用以下代码解决 DPAPI 用户会话 cookie 问题。
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate)
});
var readOnlyTransforms = sessionTransforms.AsReadOnly();
var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
我已经尝试为此使用 SHA256 证书,但我仍然遇到同样的错误。
经过如此多的研究,我的一位朋友的建议奏效了。我在 Global.asax.cs
中使用了以下代码
protected void Application_Start(object sender, EventArgs e)
{
//Certificate
FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate)
});
var readOnlyTransforms = sessionTransforms.AsReadOnly();
var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
问题出在下一行,
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
根据 MSDN,在不支持 SHA-256 的情况下,我们可以使用 RsaSignatureCookieTransform 而不是这个。所以我们使用以下行而不是 RsaSignatureCookieTransform。
new RsaSha1SignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate),
这解决了我们的问题。
用户从 ADFS 成功验证后,我在某些服务器中遇到以下错误。
[ArgumentException: ID6037: Cannot create algorithm with name 'http://www.w3.org/2000/09/xmldsig#hmac-sha1'.
Parameter name: algorithm]
Microsoft.IdentityModel.Algorithms.NewDefaultEncryption() +170
Microsoft.IdentityModel.Web.RsaEncryptionCookieTransform.Encode(Byte[] value) +204
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +47
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(XmlWriter writer, SecurityToken token) +449 Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(SessionSecurityToken sessionToken) +84
Microsoft.IdentityModel.Web.SessionAuthenticationModule.WriteSessionTokenToCookie(SessionSecurityToken sessionToken) +123
....
它在我们的开发/暂存服务器中运行良好。但它在其他一些服务器和生产服务器上不起作用。我正在使用以下代码解决 DPAPI 用户会话 cookie 问题。
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate)
});
var readOnlyTransforms = sessionTransforms.AsReadOnly();
var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
我已经尝试为此使用 SHA256 证书,但我仍然遇到同样的错误。
经过如此多的研究,我的一位朋友的建议奏效了。我在 Global.asax.cs
中使用了以下代码protected void Application_Start(object sender, EventArgs e)
{
//Certificate
FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate)
});
var readOnlyTransforms = sessionTransforms.AsReadOnly();
var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
问题出在下一行,
new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
根据 MSDN,在不支持 SHA-256 的情况下,我们可以使用 RsaSignatureCookieTransform 而不是这个。所以我们使用以下行而不是 RsaSignatureCookieTransform。
new RsaSha1SignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate),
这解决了我们的问题。