2010-10-04 6 views
4

J'ai joué avec MySql en tant que fournisseur d'appartenances pour l'authentification de formulaires asp.net mvc. J'ai configuré les choses correctement pour autant que je sache, et je peux créer des utilisateurs via l'action de registre et le site de configuration web asp.net. Cependant, lorsque j'essaie de me connecter avec l'un des utilisateurs, cela ne fonctionne pas. il renvoie une erreur comme si j'avais entré un mot de passe incorrect, ou si le compte n'existe pas.Fournisseur d'appartenance ASP.NET MVC + MySql, l'utilisateur ne peut pas se connecter

J'ai vérifié dans la base de données que le compte existe bel et bien. J'ai suivi les instructions ici pour référence: http://blog.tchami.com/post/ASPNET-MVC-2-and-MySQL-Membership-Provider.aspx

Voici mon 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> 

Quelqu'un peut-il me s'il vous plaît aider à identifier ce qui est faux afin que les utilisateurs peuvent se connecter?

MISE À JOUR

Ainsi, après le débogage du processus de connexion dans le code du fournisseur d'appartenances lui-même, je découvre qu'il ya un bogue dans le fournisseur. Il existe une divergence entre le hachage de mot de passe stocké dans la base de données et le has qui est généré sur la base du mot de passe entré. Pour contourner ce problème, j'ai changé le format du mot de passe en 'encrpyted' et ajouté une clé machine à mon web.config. Je suis toujours intéressé à trouver le problème avec le format haché dans le fournisseur, et passera plus de temps à le déboguer, et si je peux comprendre le problème, je vais mettre en place un patch et le soumettre.

+0

J'ai le même problème. Merci de poster ce que vous avez compris jusqu'à présent! –

Répondre

5

A partir de .NET 4, l'algorithme de hachage utilisé par le connecteur MySQL a changé de SHA1 à quelque chose de plus compliqué (HMACSHA256)

pour surmonter ce problème, vous pouvez modifier votre fichier web.config.

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

Plus à ce sujet peut être trouvé à: http://www.devart.com/forums/viewtopic.php?t=17508&postdays=0&postorder=asc&start=15&sid=ed160634c0e76b0fb1a4a565e8b5e200

1

Assurez-vous que l'utilisateur n'a pas été verrouillé. La propriété islocked est dans l'une des tables que sqlmembershipprovider utilise pour fournir des services d'enregistrement (ne me souviens pas du nom exact :() je suis tout à fait sûr que c'est le problème et que vous devez changer la forme islocked true à false pour vous connecter en utilisant les identifiants de connexion de cet utilisateur

+0

J'ai trouvé la colonne dans la table d'appartenance, et la colonne a déjà été définie à 0. –