Предоставеното потребителско име или парола са неправилни. в интернет приложение 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 където се инсталират всички файлове. След това добавям тези файлове към моя проект C# Class Library MyCustomMembershipProvider, който току-що създадох, SQLMembershipProvider.cs, SecUtil.cs, SqlConnectionHelper.cs и < strong>SR.cs. (Имам нужда от всички тези файлове или проектът C# Class Library MyCustomMembershipProvider няма да се компилира). След това добавям препратка към System.configuration, System.Web и System.Web.ApplicationServices към проекта C# Class Library MyCustomMembershipProvider. След това изграждам проекта и след това отивам в MyMvc3App и добавям препратка към проекта MyCustomMembershipProvider.

Забележка: Забравих да спомена, че промених пространството от имена за всичките четири файла в проекта MyCustomMembershipProvider на "пространство от имена MyCustomMembershipProvider" и също така преименувах името на класа на MyCustomMembershipProvider. И също така в SQLMembershipProvider.cs ред 110 го промених от 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.

Опитах се да разбера защо, така че потърсих в Google и открих, че добавянето на елемента machineKey може да работи. Така че отидох на този сайт http://www.developmentnow.com/articles/machinekey_generator.aspx и генерира ASP.NET 2.0 machineKey и го копира, постави в елемента system.web на web.config:

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

Още веднъж направих абсолютно същото нещо като преди; Отивам на localhost:10382/Account/Register и създавам потребител, този път наричам потребителя „test3“. След като потребителят бъде създаден, аз съм пренасочен към началната страница. излизам. След това отивам на localhost:10382/Account/LogOn и въвеждам потребителското име и паролата за потребителя "test3" и щраквам върху бутона "Вход" и BAM! потребителят отново е влязъл!?

Защо трябваше ръчно да конфигурирам machineKey с генериран validationKey и decryptionKey в web.config, за да може MyCustomMembershipProvider да работи със страницата за вход? Доколкото видях, няма нито една статия/страница/блог, която да говори за добавяне на елемент machineKey към вашия web.config, за да може вашият потребителски доставчик на членство да работи!

АКТУАЛИЗАЦИЯ 1: Добавянето на hashAlgorithmType="SHA1" също работи:

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

Странно обаче е, че MSDN казва, че SHA1 е по подразбиране!?

hashAlgorithmType Незадължителен низов атрибут. Указва името на алгоритъма за криптиране, който се използва за хеширане на стойностите на паролата. Стойността на този атрибут съответства на атрибута name на елемент nameEntry в раздела за конфигуриране на cryptoNameMapping. За информация относно определянето на персонализиран алгоритъм за хеширане вижте Съпоставяне на имена на алгоритъм към криптографски класове. По подразбиране е SHA1.

АКТУАЛИЗАЦИЯ 2: След като прочетох за най-новите технологии на Microsoft, реших да споделя някои от констатациите, които открих относно техния най-нов доставчик на членство; SimpleMembership. Аз съм на етап в моя личен проект, когато реших да премахна CustomMembershipProvider от ASP.NET 2.0 дни, които създадох, и вместо това да използвам SimpleMembership доставчик. Защо? Ами имате цялата информация, която някога ще искате да знаете, в следната публикация в блога на Джон Галоуей. Също така добавям още няколко връзки към ресурси, които си струва да разгледате. Според Microsoft SimpleMembership е наследник на ASP.NET 2.0 Membership.

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, реших да споделя някои от констатациите, които открих относно последния им доставчик на членство; SimpleMembership. Намирам се на етапа на моя личен проект, в който реших да се откажа от CustomMembershipProvider, който създадох, и вместо това да използвам доставчика SimpleMembership. Защо? Ами имате цялата информация, която някога ще искате да знаете в тази публикация в блога. Също така добавям още няколко връзки към ресурси, които си струва да разгледате.   -  person PussInBoots    schedule 31.10.2012