Problemi con un Membership Provider personalizzato con ASP.Net 2.0

mercoledì 05 novembre 2008 - 09.14

patrizia84 Profilo | Junior Member

Ciao a tutti,
Ho creato una mia membership provider personalizzata (chiamata MyMembershipProvider) che eredita da MembershipProvider per autenticare gli utenti facendo solo l'override della ValidateUser.
Mi accede al database,mi esegue correttamente la query.
Ho inserito una semplice pagina .aspx che contiene solo un controllo login collegato con questo membership provider.
Nel web.config ho messo :


<authentication mode="Forms">
<forms loginUrl="login4.aspx" defaultUrl="index.aspx"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" connectionStringName="strCnn" type="MyMembershipProvider"/>
</providers>
</membership>



dove strCnn è la connessione che ho aggiunto nella sezione dedicata nel web.config per le connessione.

Quando vado ad eseguire l'autentificazione mi dice sempre che il login e la password sono errati,anche se la query nella ValidateUser funziona bene..
Ho dimenticato qualcosa?

Grazie per l'attenzione e mi scuso per aver scritto tanto ma volevo essere chiara e spero di esserci riuscita...

rossimarko Profilo | Guru

Ciao,

sei partita da questo articolo per fare le prove? http://www.dotnethell.it/articles/Membership-Role-Profile-Provider.aspx

Una prima cosa da verificare è che la ValidateUser ritorni true (lo puoi fare anche in debug). Il messaggio che ti dice che utente e password sono errati ti viene dato dal controllo di login?

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

patrizia84 Profilo | Junior Member

Ciao Marco,grazie per avermi risposto.
Premetto che è poco più di un mese che ho iniziato ASP.NET.

Ho visto molti articoli su internet e sul manuale di ASP.NET .Ho visto anche quello indicato nel link che mi hai segnalato.(e ora che controllo è tuo!!!).

Quando fa il return la funzione restituisce true.
Questo è il fatto strano.


Non capisco perchè non va..

rossimarko Profilo | Guru

E' molto strano. Hai già provato a fare un pulsante di test che richiama solamente la ValidateUser e vedere cosa fa?


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

patrizia84 Profilo | Junior Member

Grazie per il consiglio.
Ho provato a seguire il tuo consiglio.
Ho fatto un bottone di test che richiama la ValidateUser del mio MembershipProvider passando dei parametri manualmente.
Mi restituisce true passando dei parametri esistenti nel mio database e false altrimenti.

rossimarko Profilo | Guru

Prova a postare un po' di codice, così guardiamo se c'è qualche anomalia, in base a quello che mi hai detto non sembra, ma non si sa mai...


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

patrizia84 Profilo | Junior Member

Scusami ma non ho capito cosa intendi per postare un po di codice..

Ho intercettato l'evento Authenticate del login e ho messo:

Response.Write(e.Authenticated)

per vedere cosa mi fa e mi visualizza un false.

Mi pongo due domande:
1) non entra nell'evento Authenticate solo se ha riconosciuto username e password?
2) non dovrebbe visualizzarmi un true?

rossimarko Profilo | Guru

>Scusami ma non ho capito cosa intendi per postare un po di codice..

Scusa, intendevo dire di inviarci il codice del login control per capire meglio se c'è qualcosa che non va.

Nel logincontrol hai tre eventi che puoi intercettare per capire cosa sta succedendo:
- LoggedIn
- LoggingIn
- LoginError

Prova ad agganciarti a tutti e tre vedere quale viene scatenato
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Ti invio il codice che può essere utile per capire cosa non funziona.

File AppCode/MyMembershipProvider


public override void Initialize(string name, NameValueCollection config)
{

if (config == null)
throw new ArgumentNullException("confi");

if (String.IsNullOrEmpty(name))
name = "MyMembershipProvider";

if (String.IsNullOrEmpty(config["description"]))
{
config.Remove("description");
config.Add("description", "Custom Provider");

}

base.Initialize(name, config);


}


public override bool ValidateUser(string username, string password)
{

int trovato = 0;


string conn = ConfigurationManager.ConnectionStrings["strCnn"].ConnectionString;
string query = "SELECT COUNT(*) FROM USERS WHERE username='" + username + "' AND password='" + password + "';";

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

SqlCommand cmd = new SqlCommand(query, connessione);
trovato = (int)cmd.ExecuteScalar();

connessione.Close();




if (trovato > 0)

return true;

else


return false;

}



File login4.aspx

<body>

<form id="form1" runat="server">
<asp:Login runat="server" ID="contrLogin"
MembershipProvider="MyMembershipProvider" DestinationPageUrl="~/index.aspx"
onauthenticate="contrLogin_Authenticate" BackColor="#F7F7DE"
BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px"
Font-Names="Verdana" Font-Size="10pt" onloggingin="contrLogin_LoggingIn" >
<TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" />
</asp:Login>

</form>
</body>


file Web.config



<configuration>
<appSettings/>
<connectionStrings>
<remove name="strCnn"/>
<add name="strCnn" providerName="MyMembershipProvider" connectionString="Data Source=VPWK022-TV\SQLEXPRESS;Initial Catalog=marketDb.MDF;User ID=fwb02;Password=fwb02"/>
</connectionStrings>
<system.web>
<compilation debug="true">
</compilation>
<!--
<authentication mode="Forms">
<forms loginUrl="login4.aspx" defaultUrl="index.aspx"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" connectionStringName="strCnn" type="MyMembershipProvider"/>
</providers>
</membership>
</system.web>
</configuration>



Non vorrei che ci siano dei problemi con le autorizzazioni al database.
In teoria non dovrebbero esserci perchè la query la esegue in modo corretto.

Grazie per la disponibilità.



Ho provato ad intercettare gli eventi inserendo delle stampe a video negli eventi.
Ti invio anche il file login4.aspx.cs


File login4.aspx.cs


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;


public partial class login4 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}


protected void contrLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
Response.Write("sei stato autenticato ");
}
protected void contrLogin_LoggingIn(object sender, LoginCancelEventArgs e)
{
Response.Write("hai inviato le informazioni di login :ATTENDI " );
}

protected void contrLogin_LoginError(object sender, EventArgs e)
{
Response.Write("si è verificato un errore di login");
}
protected void contrLogin_LoggedIn(object sender, EventArgs e)
{
Response.Write("sei loggato (sei autenticato)");
}
}



Eseguendo mi entra negli eventi:

1)LoggingIn
2)Authenticate
3)LoginError


rossimarko Profilo | Guru

Se mi dici che ritorna true non dovrebbero esserci problemi di connessione, dal codice che vedo vuol dire che la query è stata eseguita.

Prova a togliere dal controllo di login il nome del provider (è già specificato nel web.config e basta quello):
<asp:Login runat="server" ID="contrLogin" MembershipProvider="MyMembershipProvider"

e verifica in debug che venga ancora chiamato il metodo validateuser.

Un'altra prova che puoi fare è quella di fare una prova con un controllo di login pulito, senza eventi:

<asp:Login runat="server" ID="contrLogin" DestinationPageUrl="~/index.aspx"> <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" /> </asp:Login>
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

patrizia84 Profilo | Junior Member

Niente.Non riesco a risolvere.
Ora ho un altro problema.

il Web Site Administration Tool mi dice :

There is a problem with your selected data store. This can be caused by an invalid server name or credentials, or by insufficient permission. It can also be caused by the role manager feature not being enabled. Click the button below to be redirected to a page where you can choose a new data store.

The following message may help in diagnosing the problem: The method or operation is not implemented.




Funziona!!!
Ho riscritto il codice della MyMembershipProvider e ho scritto un login control "pulito" come mi avevi suggerito.
Grazie mille er i consigli...
A presto.
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5