ASP.NET MVC + MySql членство провайдер, пользователь не может войти - PullRequest
4 голосов
/ 04 октября 2010

Я играл с MySql в качестве поставщика членства для аутентификации mvc-форм asp.net. Насколько я могу судить, у меня все настроено правильно, и я могу создавать пользователей с помощью действия регистрации и сайта веб-конфигурации asp.net. однако, когда я пытаюсь войти в систему с одним из пользователей, это не работает. он возвращает ошибку, как если бы я ввел неправильный пароль или учетная запись не существует.

Я подтвердил в базе данных, что учетная запись существует. Я следовал инструкциям здесь для справки: http://blog.tchami.com/post/ASPNET-MVC-2-and-MySQL-Membership-Provider.aspx

вот мой 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="MySQLConn" connectionString="Server=localhost;Database=intereditor;Uid=<user>;Pwd=<password>;"/>
  </connectionStrings>

  <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.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms 
        loginUrl="~/Account/LogOn" 
        timeout="2880"
        name=".ASPXFORM$"
        path="/"
        requireSSL="false"
        slidingExpiration="true"
        enableCrossAppRedirects="false"
        />
    </authentication>

    <membership defaultProvider="MySqlMembershipProvider">
      <providers>
        <clear/>
        <add name="MySqlMembershipProvider"
      type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.3.4.0, Culture=neutral,PublicKeyToken=c5687fc88969c44d"
        autogenerateschema="true" connectionStringName="MySQLConn"
        enablePasswordRetrieval="false" enablePasswordReset="true"
        requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
        passwordFormat="Hashed" maxInvalidPasswordAttempts="5"
        minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0"
        passwordAttemptWindow="10" passwordStrengthRegularExpression=""
        applicationName="/" />
      </providers>
    </membership>

    <profile defaultProvider="MySqlProfileProvider">
      <providers>
        <clear/>
        <add name="MySqlProfileProvider"
        type="MySql.Web.Profile.MySQLProfileProvider,MySql.Web,Version=6.3.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
        connectionStringName="MySQLConn" applicationName="/" />
      </providers>
    </profile>

    <roleManager enabled="true" defaultProvider="MySqlRoleProvider">
      <providers>
        <clear />
        <add name="MySqlRoleProvider"
        type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
        connectionStringName="MySQLConn" applicationName="/" />
      </providers>
    </roleManager>
    <pages>
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </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" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Может кто-нибудь помочь мне определить, что не так, чтобы пользователи могли войти?

UPDATE

Итак, после отладки процесса входа в код самого провайдера членства я обнаружил, что в провайдере есть ошибка. Существует несоответствие между хэшем пароля, который хранится в базе данных, и хэшем, который генерируется на основе введенного пароля. В качестве обходного пути для моей проблемы я изменил формат пароля на «encrpyted» и добавил машинный ключ в мой web.config.

Мне все еще интересно выяснить проблему с хэшированным форматом в поставщике, и я потрачу еще немного времени на его отладку, и если я смогу выяснить проблему, я соберу патч и отправлю его. *

Ответы [ 3 ]

5 голосов
/ 16 января 2011

Начиная с .NET 4, алгоритм хеширования, используемый соединителем MySQL, изменился с SHA1 на что-то более сложное (HMACSHA256).

Чтобы преодолеть это, вы можете изменить свой файл web.config:

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

Подробнее об этом можно узнать по адресу: http://www.devart.com/forums/viewtopic.php?t=17508&postdays=0&postorder=asc&start=15&sid=ed160634c0e76b0fb1a4a565e8b5e200

1 голос
/ 04 октября 2010

убедитесь, что пользователь не был заблокирован. Свойство islocked находится в одной из таблиц, которые использует sqlmembershipprovider для предоставления услуг регистрации (не помню точное имя :() я совершенно уверен, что это проблема, и вам нужно изменить islocked форму true на false для входа в систему с использованием учетных данных этого пользователя

0 голосов
/ 14 марта 2011

У меня была похожая проблема.Похоже, что это связано с ошибкой в ​​поставщике членства mysql: http://bugs.mysql.com/bug.php?id=58906 Попробуйте обновить до> = 6.3.6

...