Controllo PasswordRecovery

giovedì 06 novembre 2008 - 18.05

patrizia84 Profilo | Junior Member

Ciao,
sto tentando di utilizzare il controllo PasswordRecovery per recuperare la password inserendo lo username.
Ho creato una mia classe MembershipUser,ho implementato il metodo getUser del mio provider membership personalizzato,ho configurato il web.config però quando lo eseguo mi dice che il metodo RequiresQuestionAndAnswer non è implementato.
Sai darmi un consiglio o indicarmi dei link dove posso trovare informazioni su questo controllo?

Grazie.

balfaz Profilo | Expert

non ho esperienza in questo ambito ma spero che questo link ti serva

http://www.asp.net/learn/security/


"Ci sono due tipi di pazzi, quelli che dicono pazzie e quelli che le fanno diventare una realtà."

patrizia84 Profilo | Junior Member

Grazie.Sicuramente mi sarà di aiuto...
Ciao.

rossimarko Profilo | Guru

>però quando lo eseguo mi dice che il metodo RequiresQuestionAndAnswer
>non è implementato.

Ciao,

hai verificato se la proprietà RequiresQuestionAndAnswer è stata implementata all'interno del tuo MembershipProvider?
Qui trovi la documentazione sul MembershipProvider: http://msdn.microsoft.com/en-us/library/aa478949.aspx

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Ciao.
Nel mio MembershipProvider ho


public override bool RequiresQuestionAndAnswer
{
get { throw new NotImplementedException(); }
}

perchè non voglio che il mio controllo RecoveryPassword richieda la domanda.

e nel mio web.config ho:


<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider"
connectionStringName="strCnn"
enablePasswordRetrieval="true"
requiresQuestionAndAnswer="false"
enablePasswordReset="false"
passwordFormat="Clear"
/>
</providers>
</membership>


Ho sbagliato qualcosa?
Grazie mille.



Per ora questo problemino l'ho risolto...però ne dà un altro..
Ho messo :

public override bool RequiresQuestionAndAnswer
{
get
{
return false;
}
}


Grazie ancora.

rossimarko Profilo | Guru

>public override bool RequiresQuestionAndAnswer
>{
>get { throw new NotImplementedException(); }
>}

Si, il problema era quello. Devi settare true o false a seconda di quello che desideri ottenere (http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.requiresquestionandanswer.aspx)

Una volta messo quello che altri problemi hai?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Grazie per i link..
Il controllo chiama la getUser del mio membership provider però in questa funzione non riesco ad accedere al database e quindi mi dice che :


Your attempt to retrieve your password was not successful. Please try again

Ti invio il codice della getUser cosi' mi dici se vedi errori prima che io riesco a risolvere da sola.



public override MembershipUser GetUser(string username, bool userIsOnline)
{
string conn = ConfigurationManager.ConnectionStrings["strCnn"].ConnectionString;
string query="SELECT userID,username,password,key1web,key2web,email FROM users WHERE username='"+ username+"';";

SqlConnection connessione = new SqlConnection(conn);
connessione.Open();

SqlCommand cmd = new SqlCommand(query,connessione);

MyMembershipUser u=null;

SqlDataReader reader;



reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
u = GetUserFromReader(reader);
}



return u;
}

private MyMembershipUser GetUserFromReader(SqlDataReader reader)
{

int userIDMP = (int)reader.GetValue(0);
string usernameMP = (string)reader.GetValue(1);
string passwordMP = (string)reader.GetValue(2);
int key1webMP = (int)reader.GetValue(3);
string key2webMP = (string)reader.GetValue(4);
string emailMP = (string)reader.GetValue(5);

MyMembershipUser u = new MyMembershipUser(userIDMP, usernameMP, passwordMP, key1webMP, key2webMP, emailMP);

return u;

}



Grazie ancora...

patrizia84 Profilo | Junior Member

Grazie per i link..
Il controllo chiama la getUser del mio membership provider però in questa funzione non riesco ad accedere al database e quindi mi dice che :


Your attempt to retrieve your password was not successful. Please try again

Ti invio il codice della getUser cosi' mi dici se vedi errori prima che io riesco a risolvere da sola.



public override MembershipUser GetUser(string username, bool userIsOnline)
{
string conn = ConfigurationManager.ConnectionStrings["strCnn"].ConnectionString;
string query="SELECT userID,username,password,key1web,key2web,email FROM users WHERE username='"+ username+"';";

SqlConnection connessione = new SqlConnection(conn);
connessione.Open();

SqlCommand cmd = new SqlCommand(query,connessione);

MyMembershipUser u=null;

SqlDataReader reader;



reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
u = GetUserFromReader(reader);
}



return u;
}

private MyMembershipUser GetUserFromReader(SqlDataReader reader)
{

int userIDMP = (int)reader.GetValue(0);
string usernameMP = (string)reader.GetValue(1);
string passwordMP = (string)reader.GetValue(2);
int key1webMP = (int)reader.GetValue(3);
string key2webMP = (string)reader.GetValue(4);
string emailMP = (string)reader.GetValue(5);

MyMembershipUser u = new MyMembershipUser(userIDMP, usernameMP, passwordMP, key1webMP, key2webMP, emailMP);

return u;

}



Grazie ancora...

Scusa se l'ho inviato due volte ma mi ha dato problemi il browser...


L'utente lo riconosce però mi restituisce sempre :

Your attempt to retrieve your password was not successful. Please try again

rossimarko Profilo | Guru

Come mai non riesci ad accedere al database? Che errore ti da?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Al database ci accede e trova l'utente.
Nel debug ho visto che esegue bene la getUser,entra nella RequiresQuestionAndAnswer esegue il return false,esce e mi visualizza :


Your attempt to retrieve your password was not successful. Please try again.

Non capisco!
Dovrebbe eseguire la getPassword considerando che il we.config è cosi:


<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider"
connectionStringName="strCnn"
enablePasswordRetrieval="true"
requiresQuestionAndAnswer="false"
enablePasswordReset="false"
passwordFormat="Clear"
/>
</providers>
</membership>

rossimarko Profilo | Guru

Le proprietà enablePasswordRetrieval e enablePasswordReset come sono state impostate nel tuo Provider personalizzato?

Perchè quello che c'è nel webconfig è valido solo se viene letto dal tuo provider altrimenti non vengono prese in considerazione..

Mi spiego meglio. Se nel web.config hai:

<add name="CustomMembershipProvider"
connectionStringName="databaseCM"
enablePasswordRetrieval="true"
enablePasswordReset="true"
ecc

ma se poi nella property enablePasswordRetrieval del provider personalizzato hai il seguente codice
return false;
allora la proprietà sarà a false
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Prima di tutto Grazie di tutti i consigli che mi stai dando..


Sono impostate bene.
Ti invio il codice:

public override bool EnablePasswordReset
{
get { return true; }
}
public override bool EnablePasswordRetrieval
{
get { return true; }
}



public override bool RequiresQuestionAndAnswer
{
get
{
return false;

}


Nel mio Membership provider ho sovrascritto queste funzioni:

EnablePasswordReset
EnablePasswordRetrieval
RequiresQuestionAndAnswer
getUser
getPassword


Manca qualcosa da sovrascrivere?

rossimarko Profilo | Guru

>Nel mio Membership provider ho sovrascritto queste funzioni:
>
>EnablePasswordReset
>EnablePasswordRetrieval
>RequiresQuestionAndAnswer
>getUser
>getPassword
>
>

Prova ad implementare anche il metodo ResetPassword visto che è stato impostato a true.
Hai verificato che l'email associata all'utente sia valida e sia caricata correttamente nei dati del MembershipUser?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Ho impostato a false enablePasswordReset,ho fatto ritornare false al metodo EnablePasswordReset e ho lasciato il metodo ResetPassword perchè nella mia applicazione non serve.
Il valore dell'email mi viene restituito in modo corretto.

rossimarko Profilo | Guru

Un'altra cosa che devi verificare è se le impostazioni della mail sono corrette. Hai impostato i dati di invio (From, subject)
<asp:PasswordRecovery ID="ctrl" runat="server"> <MailDefinition From="pippo@pippo.com"> </MailDefinition> </asp:PasswordRecovery>

e la configurazione del server smtp nel web.config?

<system.net> <mailSettings> <smtp deliveryMethod="Network" from="noreply@pippo.com"> <network host="mail.pippo.it" port="25" /> </smtp> </mailSettings> </system.net>
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Sembra che li ho impostati bene.

rossimarko Profilo | Guru

Hai già provato ad inviare email dal sito? Eventualmente fai una procedura che invia una mail di test e guarda se ti arriva (non specificare le impostazioni del server ma lasciale prendere dal web.config)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Non ho ancora fatto questa prova.
Ora ci provo.
Grazie.



Ciao..
Sto facendo la prova che mi hai consigliato.Sto utilizzando l'esempio che hai suggerito ad un altra persona che aveva un problema simile al mio.
In particolare sto guardando questo link:

http://technet.microsoft.com/it-it/library/bb123686.aspx

Al passo 8,dopo che faccio DATA mi restituisce che il messaggio è stata bloccato dall'antivirus.
Cosa posso fare?
Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5