none
SignedXml em NET 2 vs. NET 4.5 RRS feed

  • Pergunta

  • Prezados,

    Tenho uma aplicação web em asp.net, que consome um webservice em delphi e que o mesmo utiliza uma DLL criada em C# para realizar assinaturas.

    Com a aplicação web instalada no IIS, apresenta erro. Ao executar o webservice dentro do IIS utilizando o SOAPUI também apresenta erro. Ao testar o webservice fora do IIS usando o delphi + SOAPUI o processo funciona. Todos os testes foram realizados com a NET 4.5.

    Todos os cenários com erro, ocorrem no método ComputeSignature(). Abaixo o erro reportado.

    System.ArgumentException: Caracteres inválidos no caminho.

       em System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras)

       em System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)

       em System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)

       em System.AppDomainSetup.VerifyDir(String dir, Boolean normalize)

       em System.AppDomainSetup.get_ConfigurationFile()

       em System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)

       em System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)

       em System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)

       em System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp()

       em System.Configuration.ClientConfigurationSystem..ctor()

       em System.Configuration.ConfigurationManager.EnsureConfigurationSystem()

    Na DLL ao trocar a versão do NET para a 2.0 método de assinatura funciona normalmente, usando dentro do IIS.

    Gostaria de saber o motivo de funcionamento na 2.0 e se há alguma configuração que deve ser feita na DLL ou no IIS para funcionar na versão 4.5.

    Segue abaixo o código da assinatura:

    private XmlElement GerarAssinatura(bool IsSalvador, XmlDocument doc, XmlNode childNodes)
            {
                XmlElement retorno = null;
                try
                {
                    Reference reference = new Reference();
                    reference.Uri = "";
    
                    XmlElement childElemen = (XmlElement)childNodes;
                    if (childElemen.GetAttributeNode("Id") != null)
                    {
                        reference.Uri = "#" + childElemen.GetAttributeNode("Id").Value;
                    }
                    else if (childElemen.GetAttributeNode("id") != null)
                    {
                        reference.Uri = "#" + childElemen.GetAttributeNode("id").Value;
                    }
    
                    RSACryptoServiceProvider privateKeyProvider = (RSACryptoServiceProvider)certificado.PrivateKey;
    
                    SignedXml signedXml = new SignedXml(doc);
                    signedXml.SigningKey = privateKeyProvider;
    
                    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                    reference.AddTransform(env);
    
                    if (!IsSalvador)
                    {
                        XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
                        reference.AddTransform(c14);
                    }
    
                    signedXml.AddReference(reference);
    
                    KeyInfo keyInfo = new KeyInfo();
                    KeyInfoX509Data x509Data = new KeyInfoX509Data(certificado);
                    if (IsSalvador)
                    {
                        KeyInfoClause rsaKeyVal = new RSAKeyValue((RSA)privateKeyProvider);
                        keyInfo.AddClause(rsaKeyVal);
    
                        x509Data.AddSubjectName(certificado.SubjectName.Name.ToString());
                    }
    
                    keyInfo.AddClause(x509Data);
    
                    signedXml.KeyInfo = keyInfo;
    
                    signedXml.ComputeSignature();
    
                    retorno = signedXml.GetXml();
                }
                catch (Exception erro)
                {
                    AddMensagem("Ocorreu erro ao assinar. " + erro.InnerException.ToString());
                }
                return retorno;
            }
    


    quarta-feira, 14 de junho de 2017 13:31