Указано неверное имя пользователя или пароль. в Интернет-приложении MVC 3

У меня есть "Интернет-приложение" - "Проект по умолчанию ASP.NET MVC 3 с контроллером учетной записи, который использует проверку подлинности с помощью форм." под названием MyMv3App . Я запускаю сайт в IIS Express с помощью Ctrl + F5, затем перехожу на localhost: 10382 / Account / Register и создаю пользователя «test1». После создания пользователя я перенаправляюсь на домашнюю страницу. Я выхожу из системы. Затем я перехожу на localhost: 10382 / Account / LogOn и набираю имя пользователя и пароль для пользователя «test1», нажимаю кнопку «Войти», и пользователь входит в систему. Круто, пока все в порядке!

Затем я добавляю новый проект C # «Библиотека классов» и называю его MyCustomMembershipProvider. Затем я загружаю ProviderToolkitSamples.msi отсюда http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx, запустите установщик msi и перейдите в папку C: \ Program Files (x86) \ ASP.NET Provider Toolkit SQL Samples, куда устанавливаются все файлы. Затем я добавляю эти файлы в свой проект MyCustomMembershipProvider библиотеки классов C #, который я только что создал, SQLMembershipProvider.cs, SecUtil.cs, SqlConnectionHelper.cs и < strong> SR.cs. (Мне нужны все эти файлы, иначе проект библиотеки классов C # MyCustomMembershipProvider не скомпилируется). Затем я добавляю ссылку на System.configuration, System.Web и System.Web.ApplicationServices в проект MyCustomMembershipProvider библиотеки классов C #. Затем я создаю проект, затем перехожу в MyMvc3App и добавляю ссылку на проект MyCustomMembershipProvider.

Примечание. Забыл упомянуть, что я изменил пространство имен для всех четырех файлов в проекте MyCustomMembershipProvider на «пространство имен MyCustomMembershipProvider», а также переименовал имя класса в MyCustomMembershipProvider. А также в строке 110 SQLMembershipProvider.cs я изменил его с name = "SqlMembershipProvider"; to name = "MyCustomMembershipProvider";

Затем я изменяю раздел членства файла web.config следующим образом:

<membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

к этому:

<membership defaultProvider="MyCustomMembershipProvider">
      <providers>
        <clear/>
        <add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

Теперь весь файл web.config выглядит так:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->

<configuration>
  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <membership defaultProvider="MyCustomMembershipProvider">
      <providers>
        <clear/>
        <add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Теперь я делаю то же самое, что и в первом абзаце; Я захожу на localhost: 10382 / Account / Register и создаю пользователя, на этот раз я вызываю пользователя «test2». После создания пользователя я перенаправляюсь на домашнюю страницу. Я выхожу из системы. Затем я перехожу на localhost: 10382 / Account / LogOn, чтобы снова войти в систему, ввести имя пользователя и пароль для пользователя «test2», нажать кнопку «Войти», и я получаю сообщение об ошибке:

Не удалось войти в систему. Исправьте ошибки и попробуйте еще раз. Указано неверное имя пользователя или пароль.

Почему? Что я пропустил? Я не касался ничего, кроме пространства имен и этой переменной name в SQLMembershipProvider.cs в строке 110.

Я попытался понять, почему, поэтому я погуглил и обнаружил, что добавление элемента machineKey может сработать. Итак, я зашел на этот сайт http://www.developmentnow.com/articles/machinekey_generator.aspx и сгенерировал ключ машины ASP.NET 2.0 и скопировал его, вставив в элемент system.web web.config:

<machineKey
        validationKey="A5E72C3BF96D34B9401278890361AA0949EAE806B124573AC3C1A8D77936B4E42BB1374D1DA443706C4E575B7F1234CB48F4CF52444CB4B1F343994752416569"
        decryptionKey="47869B2D1F1D3EBC92FCC4C2D7B0EFB707535925E116AEF85F470E138A6C8CB5"
        validation="SHA1" decryption="AES"
/>

Я снова сделал то же самое, что и раньше; Я захожу на localhost: 10382 / Account / Register и создаю пользователя, на этот раз я вызываю пользователя «test3». После создания пользователя я перенаправляюсь на домашнюю страницу. Я выхожу из системы. Затем я перехожу на localhost: 10382 / Account / LogOn и набираю имя пользователя и пароль для пользователя «test3», нажимаю кнопку «Log On» и БАМ! пользователь снова авторизован !?

Почему мне пришлось вручную настраивать machineKey с помощью сгенерированных validationKey и decryptionKey в web.config, чтобы MyCustomMembershipProvider мог работать со страницей входа? Насколько я видел, нет ни одной статьи / страницы / блога, в которых говорится о добавлении элемента machineKey в ваш web.config, чтобы ваш пользовательский поставщик членства мог работать!

ОБНОВЛЕНИЕ 1: также работает добавление hashAlgorithmType = "SHA1":

<membership defaultProvider="MyCustomMembershipProvider" hashAlgorithmType="SHA1">

Забавно то, что MSDN утверждает, что SHA1 используется по умолчанию !?

hashAlgorithmType Необязательный атрибут String. Задает имя алгоритма шифрования, который используется для хеширования значений пароля. Значение этого атрибута соответствует атрибуту name элемента nameEntry в разделе конфигурации cryptoNameMapping. Для получения информации об указании настраиваемого алгоритма хеширования см. Сопоставление имен алгоритмов классам криптографии. По умолчанию - SHA1.

ОБНОВЛЕНИЕ 2. Прочитав о последних технологиях Microsoft, я решил поделиться некоторыми выводами, которые я обнаружил относительно их последнего поставщика услуг Mebership; SimpleMembership. Я нахожусь на той стадии своего личного проекта, когда я решил отказаться от CustomMembershipProvider из дней разработки ASP.NET 2.0 и вместо этого использовать поставщик SimpleMembership. Почему? Что ж, у вас есть вся информация, которую вы когда-либо захотите узнать, в следующем сообщении в блоге Джона Гэллоуэя. Я также добавляю еще несколько ссылок на ресурсы, которые стоит проверить. Согласно Microsoft SimpleMembership является преемником членства в ASP.NET 2.0.

http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

http://mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership

http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx

http://blogs.msdn.com/b/rickandy/archive/2012/08/15/initializesimplemembership-attribute-and-simplemembership-exceptions.aspx


person PussInBoots    schedule 22.01.2012    source источник
comment
Я понимаю, что вопрос в моем первом посте смехотворно длинный, поэтому вот краткая версия моего вопроса - я надеюсь, что кто-то может указать мне правильное направление .. Зачем мне нужен элемент machineKey в web.config с использованием Microsofts SqlMembershipProvider, который я загружено с download.microsoft. com / download / a / b / 3 / для успешного входа пользователя в систему сразу после того, как тот же пользователь был сначала зарегистрирован через регистрационную форму, а затем сразу же вышел из системы?   -  person PussInBoots    schedule 27.01.2012
comment
Прочитав о новейших технологиях Microsoft, я решил поделиться некоторыми открытиями, которые я обнаружил относительно их последнего поставщика услуг Mebership; SimpleMembership. Я нахожусь на той стадии своего личного проекта, когда я решил отказаться от созданного мной CustomMembershipProvider и использовать вместо этого поставщика SimpleMembership. Почему? Что ж, у вас есть вся информация, которую вы когда-либо захотите узнать, в этом блоге. Я также добавляю еще несколько ссылок на ресурсы, которые стоит проверить.   -  person PussInBoots    schedule 31.10.2012