Problema con provider Membership personalizzato

mercoledì 28 novembre 2012 - 13.18
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server 2008 R2

Gemini Profilo | Expert

Ciao a tutti
sto per la prima volta utilizzando i provider membership ecc su un database sqlserver.
Ho creato una soluzione con all'interno un sito web e una libreria di classi.
Nella libreria ho inserito anche le classi per il provider personalizzato.
Non deve personalizzare tutti i metodi dei provider Membership, Profile e Role
Se provo ad eliminare i metodi che non personalizzo mi da errore in compilazione:

"Errore 1
'mcLibrary.Providers.myMembershipProvider' non implementa il membro astratto ereditato 'System.Web.Security.MembershipProvider.ValidateUser(string, string)'"

se invece li lascio e provo ad eseguire un login ricevo questo errore:

"NotImplementedException non è stata gestita dal codice utente
Operazione o metodo non implementato."

sull'istruzione:

throw new NotImplementedException();
public override bool ValidateUser(string username, string password)
{
throw new NotImplementedException();
}
Come devo fare per personalizzare solo alcuni metodi e utilizzare il funzionamento di default per gli altri?

Altro problema, con il provider di default di sqlserver riuscivo ad accedere a 'Configurazione di ASP:NET', ora con il provider personalizzato ricevo questo errore:
"Si è verificato un problema con l'archivio dati selezionato. È possibile che il nome o le credenziali del server non siano valide o che le autorizzazioni non siano sufficienti. È inoltre possibile che la funzione di gestione dei ruoli non sia abilitata. Fare clic sul pulsante sotto per accedere a una pagina in cui scegliere un nuovo archivio dati.

Il seguente messaggio può essere utile per la diagnosi del problema: Operazione o metodo non implementato."

Questo è il web.config:

<connectionStrings>
<add name="myConnection" connectionString="Data Source=DEV-PC;Initial Catalog=mydb;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<!-- PROVIDERS -->
<membership defaultProvider="myMembershipProvider">
<providers>
<clear/>
<add name="myMembershipProvider" type="mcLibrary.Providers.myMembershipProvider, mcLibrary" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="XXX" passwordFormat="Hashed" connectionStringName="myConnection" />
</providers>
</membership>
<profile defaultProvider="myRoleProvider" enabled="true">
<providers>
<clear/>
<add name="myProfileProvider" type="mcLibrary.Providers.myProfileProvider, mcLibrary" applicationName="XXX" connectionStringName="myConnection" />
</providers>
</profile>
<roleManager enabled="true" defaultProvider="myRoleProvider">
<providers>
<clear/>
<add name="myRoleProvider" type="mcLibrary.Providers.myRoleProvider, mcLibrary" applicationName="XXX" connectionStringName="myConnection" />
</providers>
</roleManager>
<!-- fine PROVIDERS -->
Perchè ora non riesco più ad accedere alla configurazione?
Grazie mille

Gluck74 Profilo | Guru

ciao,
riguardo l'errore in compilazione, mi pare abbastanza ovvio:
public override bool ValidateUser(string username, string password) { throw new NotImplementedException(); }
quando crei il tuo provider custom, devi ereditare per forza dalla classe astratta System.Web.Security.MembershipProvider.
Ciò vuol dire che devi per forza fare l'override di TUTTI i metodi, per creare un'implementazione concreta (gli unici 2 metodi che non devi implementare sono DecryptPassword e EncryptPassword).
Ora, se hai la necessità di ridefinire solo alcuni metodi, ed altri no, puoi usare più strade:
1 - crei la tua nuova classe provider che eredita dalla SqlMembershipProvider standard. In questo caso fai l'override solo dei metodi che ti interessano.
2 - usi il pattern Decorator creando il tuo provider come estensione di SqlMembershipProvider. ecco il codice di esempio:
public class mioProvider : MembershipProvider { private MembershipProvider internalProvider; public mioProvider(MembershipProvider prov) { internalProvider = prov; } }
in questo modo, per tutti i metodi che NON vuoi ridefinire, usi il metodo di internalProvider, esempio:
public override int GetNumberOfUsersOnline() { return internalProvider.GetNumberOfUsersOnline(); }
per tutti gli altri scrivi il tuo codice.

consiglio VIVAMENTE il secondo approccio.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

Gemini Profilo | Expert

Ottima soluzione.
Non avevo mai sentito parlare di pattern Decorator. Approfondirò
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5