A API do Membership permite-nos definir qual será o formato da senha que a mesma irá manipular. Voce pode configurar isso através da propriedade passwordFormat no arquivo Web.Config. Esse atributo recebe um dos tres valores abaixo:
-
Clear: As senhas não são criptografadas.
-
Encrypted: Senhas são criptografadas usando as configurações especificadas no elemento de configuração machineKey.
-
Hashed: As senhas são criptografadas utilizando o algoritmo de hash SHA1.
Quando optamos pelo formato Encrypted, há um passo adicional para que isso funcione. Há uma seção no arquivo de configuração chamada machineKey, que é responsável por armazenar informações relacionadas a criptografia de cookies, ViewState, etc.. Em sua configuração padrão, o ASP.NET utiliza chaves geradas automaticamente para aplicar ao algoritmo de criptografia. Esse comportamento impede o funcionamento da extração/definição da senha através do Membership em seu formato Encrypted. Se voce chegar até o método protegido EncryptPassword da classe MembershipProvider, verá que há essa consistencia:
protected virtual byte[] EncryptPassword(byte[] password)
{
if (MachineKeySection.IsDecryptionKeyAutogenerated)
{
throw new ProviderException(SR.GetString(“Can_not_use_encrypted_passwords_with_autogen_keys”));
}
return MachineKeySection.EncryptOrDecryptData(true, password, null, 0, password.Length);
}
… e isso irá atirar a seguinte exceção:
You must specify a non-autogenerated machine key to store passwords in the encrypted format. Either specify a different passwordFormat, or change the machineKey configuration to use a non-autogenerated decryption key.
Como voce tem a aplicação sendo executada em uma máquina A e move para uma máquina B, as senhas não serão mais válidas, já que as chaves são diferentes (se for a configuração padrão do ASP.NET). Devido a isso, voce precisará especificar uma chave única para o atributo validationKey e decryptionKey no arquivo Web.Config da aplicação ou no machine.Config caso queira isso para todas as aplicações. Para definir essas chaves, voce poderá utilizar o código abaixo no seu arquivo Web.Config:
<?xml version=”1.0″?>
<configuration>
<system.web>
<machineKey
validationKey= “95…23”
decryptionKey=”C7…BD”
validation=”SHA1″
decryption=”AES”/>
</system.web>
</configuration>