首页 > 解决方案 > 无法创建名称为“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 证书,但仍然遇到同样的错误。

标签: cryptographysingle-sign-onsession-cookiesadfshmacsha1

解决方案


经过这么多研究,我的一个朋友的建议奏效了。我在 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),

这解决了我们的问题。


推荐阅读