Voici la configuration du Membership provider se trouvant dans le Web.config :
Code :
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="myConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="100" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers>
</membership>
D’après cette configuration, le mot de passe doit être de 6 caractères minimum et il est “Hashed” ce qui veut dire que l’on ne peut pas retrouver le mot de passe de l’utilisateur dans la base de données.
Si on utilise directement MembershipUser.ResetPassord, la méthode va générer un mot de passe qui est généralement très compliqué. La solution serait de Override la méthode, mais créer une nouvelle classe qui hérite de MemberShipUser juste pour Override une méthode c’est un peu lourd.
Voici comment procéder pour faire plus simple.
Tout d’abord nous allons créer une méthode qui va nous retourner le MemberShipUser à partir du nom de l’utilisateur.
Code :
Public Function GetMembershipUser(ByVal userName As String) As MembershipUser
Dim mu As MembershipUser
If userName = Nothing Then
mu = Membership.GetUser()
Else
mu = Membership.GetUser(userName)
End If
Return mu
End Function
Ensuite nous allons créer une méthode qui va générer notre nouveau mot de passe.
Code :
Public Function GenPassword(ByVal lenght As Integer) As String
Dim strAlphaNum As String()
Dim password As New StringBuilder
Dim rnd As New Random
strAlphaNum = New String(58) {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
For iAlpha As Integer = 1 To lenght
password.Append(strAlphaNum(rnd.Next(58)))
Next
Return password.ToString
End Function
Vous remarquerez que la lettre O et le chiffre 0 ne seront pas utilisés car trop souvent confondu par les utilisateurs.
Et enfin nous allons créer notre propre méthode ResetUserPassword.
Code :
Public Function ResetUserPassword(ByVal userName As String) As String
Dim mu As MembershipUser = GetMembershipUser(userName)
Dim oldPassword As String = mu.ResetPassword
Dim newPassword As String = GenPassword(Membership.MinRequiredPasswordLength)
mu.ChangePassword(oldPassword, newPassword)
Return newPassword
End Function
L’astuce est simple. On utilise MembershipUser .ResetPassword qui va nous retourner un nouveau mot de passe, puis on utilise MembershipUser.ChangePassword pour modifier à nouveau le mot de passe, mais cette fois ci, en utilisant notre propre méthode GenPassword.