Question

J'écris un site Web ASP.NET MVC 3.Ceci est mon MembershipProvider personnalisé (seul ValidateUser réalisé):

public class RFMMembershipProvider : MembershipProvider
{
    IUserService userService = new UserService();

    public override bool ValidateUser(string username, string password)
    {
        return password.GetHashCode().ToString() == userService.GetUser(username).Pass;
    }
...
}

et mon fournisseur de rôle (réalisé uniquement GetRolesForUser)

public class RFMRoleProvider : RoleProvider
{
    IUserService userService = new UserService();

    public override string[] GetRolesForUser(string username)
    {
        return new string[] { userService.GetRolesForUser(username).Name };
    }
...
}

ma partie web.config

...
<system.web>

<roleManager enabled="true" defaultProvider="RFMRoleProvider">
  <providers>
    <clear/>
    <add name="RFMRoleProvider" type="RFMSite.WebUI.RFMRoleProvider, RFMSite"/>
  </providers>
</roleManager>

<membership defaultProvider="RFMMembershipProvider"
            >
  <providers>
    <clear/>
    <add name="RFMMembershipProvider"
         type="RFMSite.WebUI.RFMMembershipProvider, RFMSite"
         />
  </providers>
</membership>

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

sur l'action de connexion:

...
 if (Membership.ValidateUser(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, true);
                return RedirectToAction("Files", "Admin");
            }
...
return View();

La question est donc de savoir pourquoi lorsque je publie un site sur IIS 7.0 Membership.ValidateUser(username, password) retourne toujours faux?Cela fonctionne NORMAL sur le serveur de développement asp.net local. La connexion avec MSSQL Server est-elle correcte (je peux obtenir des données et les afficher lorsque le site Web est déployé)?Aucune exception ne se produit, renvoie toujours false ...

Était-ce utile?

La solution

Êtes-vous sûr d'appeler exactement le même code localement et en production? Je soupçonne que votre code fonctionnera un jour, sauf par accident.

Plus précisément, je doute que String.GetHashCode() retourne jamais quelque chose qui correspond à un mot de passe de votre base de données, à moins que vos utilisateurs aient l'habitude d'utiliser de longs nombres aléatoires pour leurs mots de passe. GetHashCode sert à créer des tables de hachage, pas à sécuriser les mots de passe. Je pense que vous le confondez avec HashPasswordForStoringInConfigFile, ou quelque chose de similaire.

MODIFIER pour plus de clarté:

Je ne sais pas avec certitude que le GetHashCode est votre problème, mais je ne vois rien d'autre manifestement faux. Ce serait assez facile à tester: enregistrez vos codes de hachage dans un fichier journal, car ils sont de toute façon temporaires (comme vous l'avez noté dans le commentaire).

Et oui, GetHashCode peut facilement changer lors du déploiement; si vous exécutez une architecture différente, par exemple, ou contre une version plus récente du Framework, la valeur exacte renvoyée par GetHashCode peut certainement être différente.

Autres conseils

N'utilisez pas GetHashCode à cette fin!Utilisez les hachages de sécurité MD5 ou SHA1 qui sont toujours les mêmes.GetHashCode peut renvoyer des valeurs différentes entre différentes versions de .NET Framework .Il renvoie également des valeurs différentes lorsqu'il est utilisé sur un système 32 bits et 64 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top