Pergunta

Em .NET 1.x, você poderia usar o StrongNameIdentityPermissionAttribute no seu conjunto para garantir que apenas código assinado por você poderia acessar sua montagem. De acordo com a documentação do MSDN,

Na versão .NET Framework 2.0 e posterior, as demandas por identidade permissões são ineficazes se o chamando de montagem tem confiança total.

Isto significa que qualquer aplicação com plena confiança pode simplesmente ignorar minhas exigências de segurança.

Como posso evitar que códigos não autorizados acessem o meu assembly no .NET 2.0?

Foi útil?

Solução

De acordo com a sugestão de Eric, eu resolvido verificando a chave sozinho. No código Eu quero proteger, eu adicionar a seguinte chamada,

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

Em seguida, a implementação desse método é

  /// <summary>
  /// Ensures that the given assembly is signed by My Company or Microsoft.
  /// </summary>
  /// <param name="assembly"></param>
  private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
  {
     if ( assembly == null )
        throw new ArgumentNullException( "assembly" );

     byte[] pubkey = assembly.GetName().GetPublicKeyToken();
     if ( pubkey.Length == 0 )
        throw new ArgumentException( "No public key token in assembly." );

     StringBuilder builder = new StringBuilder();
     foreach ( byte b in pubkey )
     {
        builder.AppendFormat( "{0:x2}", b );
     }
     string pkString = builder.ToString();
     if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
          pkString != "abababababababab" /* Ivara */ )
     {
        throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
     }
  }

** Nomes e chaves alterado para proteger os inocentes. Qualquer semelhança com nomes reais ou empresas é apenas uma coincidência. *

Outras dicas

Veja este artigo:
http: // blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

Particularmente esta parte:

Em versões recentes do .NET, "plena confiança significa confiança total". Ou seja, satisfaz código totalmente confiáveis ??todas as demandas, incluindo demandas para coisas como "foi assinado com esta chave", se ele realmente foi assinado ou não.

Isso não é uma falha mortal no sistema de segurança? Não totalmente confiável código sempre teve a capacidade de fazer isso, porque o código totalmente confiável tem a capacidade de controlar a evidência associado a um determinado conjunto. Se você pode controlar as provas, então você pode forjar um conjunto que parece que veio da Microsoft, não há problema. (E se você já tiver código de confiança total malicioso em seu processo, em seguida, você já perdeu - não precisa passar por assembléias Microsoft-assinados;. Ele já tem o poder de fazer tudo o que o usuário pode fazer)

Aparentemente, a Net Designers senti que este atributo não foi muito eficaz para o código plena confiança em .Net 1.x quer.

Como Joel indicou, você está fora de sorte no que diz respeito ao CAS. No entanto, você pode ser capaz de fazer o check-se em qualquer método que você precisa para proteger usando Assembly.GetCallingAssembly () para obter uma referência para o assembly que contém o código de chamada, em seguida, verificar o nome forte em que a montagem manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top