2010-10-04 1 views
4

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

Я проверял в базе данных, что учетная запись действительно существует. Я следовал инструкции здесь для справки: 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.

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

+0

У меня такая же проблема. Спасибо, что опубликовали то, что вы выяснили до сих пор! –

ответ

5

Начиная с .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

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

+0

Я нашел столбец в таблице членства, а столбец был уже установлен на 0. –

Смежные вопросы