Хешированные или зашифрованные пароли не поддерживаются автоматически сгенерированными ключами - PullRequest
10 голосов
/ 13 февраля 2009

Я создал поставщика членства и изменил свой web.config на

<membership defaultProvider="MyMembershipProvider">
   <providers>
     <clear/>
     <add name="MyMembershipProvider"
          type="Khafan.Providers.SqlMembershipProvider"
          connectionStringName="KhafanConnectionString"  
          maxInvalidPasswordAttempts="5"             
          passwordAttemptWindow="10"
          minRequiredNonalphanumericCharacters="0"
          minRequiredPasswordLength="4"
          passwordStrengthRegularExpression=""
          passwordFormat="Hashed"
          enablePasswordReset="true"
          enablePasswordRetrieval="false"             
          requiresQuestionAndAnswer="false"
          requiresUniqueEmail="true" />
   </providers>
 </membership>

но теперь, когда я пытаюсь перейти на страницу безопасности конфигурации ASP.Net, выдается следующая ошибка:

Хешированные или зашифрованные пароли не поддерживаются автоматически генерируемыми ключами

В моей базе данных я использовал Identity для моих PK. Я не знаю, проблема это или нет. Но если это так, как я могу решить это? Я не хочу менять значения идентичности.

Спасибо.

Ответы [ 2 ]

20 голосов
/ 13 февраля 2009

Это потому, что вы хэшируете пароли, но не установили определенные ключи в своем файле web.config. В этой статье MSDN есть фрагмент "генератора ключей", запустите его дважды и вставьте в файл web.config как:

<system.web>
    <machineKey  
    validationKey="<blah>"           
    decryptionKey="<blah>"
    validation="SHA1"
    decryption="AES"
    />

И это должно с вами разобраться. Это так, потому что в противном случае вы можете перенести свою базу данных / приложение на другой компьютер, и ни один из ваших паролей не будет работать, так как автоматически сгенерированные ключи компьютера будут другими:

4 голосов
/ 12 июля 2010

Было немного глупо отправиться на охоту за фрагментом "генератора ключей" в MSDN ссылка Стивен Роббинс упоминается в своем ответе, поэтому я добавляю его сюда для краткого справочника. Так что это не отдельный ответ. Это дополняет принятый ответ.

ОТ MSDN

Следующий код показывает, как генерировать случайные значения ключей. компилировать код для создания консоли приложение, а затем передать требуемый размер ключа в командной строке аргумент выражается как желаемый количество шестнадцатеричных символов. каждый байт представлен двумя шестнадцатеричными персонажи; поэтому, чтобы запросить 32-байтовый ключ, передать 64 в командной строке аргумент. Если вы не укажете аргумент, код возвращает 128 шестнадцатеричный (64-байтовый) ключ.

using System;
using System.Text;
using System.Security;
using System.Security.Cryptography;

class App {
  static void Main(string[] argv) {
    int len = 128;
    if (argv.Length > 0)
      len = int.Parse(argv[0]);
    byte[] buff = new byte[len/2];
    RNGCryptoServiceProvider rng = new 
                            RNGCryptoServiceProvider();
    rng.GetBytes(buff);
    StringBuilder sb = new StringBuilder(len);
    for (int i=0; i<buff.Length; i++)
      sb.Append(string.Format("{0:X2}", buff[i]));
    Console.WriteLine(sb);
  }
}

Кроме того, <machineKey> входит внутрь <system.web>, например:

<system.web>
    <machineKey
        validationKey=""
        decryptionKey=""
        validation="SHA1"
        decryption="AES"
/>
...