SuperBouly
Messages postés410Date d'inscriptiondimanche 1 février 2004StatutMembreDernière intervention 8 mai 2010
-
10 janv. 2007 à 08:40
kidkashy
Messages postés5Date d'inscriptionlundi 27 mars 2006StatutMembreDernière intervention20 septembre 2011
-
19 sept. 2011 à 14:34
Bonjour,
Je travaille sur VS 2005 en VB, et j'utilise la sécurité du framawork 2.0.
J'ai besoin qu'un utilisateur-adhérent soit repéré par d'autres paramètres que ceux de la table aspnet_MemberShip,
dans mon exemple, le "code postal" et "la ville".
J'ai donc rajouté au Web.config :
<profiledefaultProvider="SqlProvider">
<providers>
<clear />
<addname="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="SampleApplication"
description="SqlProfileProvider for SampleApplication" />
</providers>
<properties>
<addname="CP" />
<addname="Ville" />
</properties>
</profile>
Ensuite, il est très facile d'alimenter la table "aspnet_Profile" de la base de sécurité ASPNETDB.MDF par la simple ligne :
Profile.Ville = "Amiens"
et de récupèrer cette valeur ensuite par
MonLabel.Text = Profile.Ville
Mais L'application impute alors cette propriété à l'UTILISATEUR CONNECTE !
Comment l'administrateur peut-il imputer cette propriété à un utilisateur quelconque ?
La classe "Profile" ne convient peut-être pas, d'ailleurs, la doc dit :
La fonctionnalité de profil ASP.NET associe des informations à un utilisateur donné et les stocke sous un format persistant.
Mais aussi :
ASP.NET fait automatiquement correspondre l'utilisateur actuel, qu'il soit anonyme ou connecté, aux informations personnelles qui sont stockées dans leur compte d'utilisateur.
Alors, comment faire, quelle classe utiliser ? Faut-il communiquer avec cette base de façon classique (requête,commande etc) ? Quelqu'un a-il une lumière à apporter ?
merci
Gilles
SuperBouly
Messages postés410Date d'inscriptiondimanche 1 février 2004StatutMembreDernière intervention 8 mai 2010 11 janv. 2007 à 20:34
bon, tu es un chef, voici que tout marche et que tout s'explique :
dans le web.config :
<!-- ne mas mettre
<providers>
<clear />
<addname= "SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="SampleApplication"
description="SqlProfileProvider for SampleApplication" />
</providers>
c'est cette mention qui faisait écrire une 2e fois l'user avec une UserId différente et qui fichait le bazard !
-->
La syntaxe de la page :
Dim CP As String = "25100"
Dim Ville As String = "Amiens"
Dim monUser As String = "monUser"
Dim prof As ProfileBase = ProfileBase.Create(monUser)
prof.SetPropertyValue("CP", CP)
prof.SetPropertyValue("Ville", Ville)
prof.Save() 'eh oui !!
voilà, comme quoi on peut s'arracher les cheveux, ça finit par marcher !
-----
Pour le livre de G.Nicot, il n'est pas pour toi, mais par exemple pour les gens qui veulent passer de l'asp à asp.net, les débutants-initiés mais pas les super confirmés. Les approfondissements ne sont qu'effleurés.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 10 janv. 2007 à 11:28
Bonjour,
il me semble que le ProfileProvider par défaut est le sqlprofileprovider tu ne dois pas avoir à le spécifier dans ton web.config, mais je peux me tromper :)
en ce qui concerne les utilisateurs anonymes il faut jouer avec la propriété allowanonymous dans les properties de ton profile. En tout cas un truc avec anonymous pas loin du rien dans le code .net :-)
SuperBouly
Messages postés410Date d'inscriptiondimanche 1 février 2004StatutMembreDernière intervention 8 mai 2010 10 janv. 2007 à 13:12
merci pour ta réponse.
Cependant je n'ai pas employé les mots exacts :
j'ai parlé de l'utilisateur connecté, je voulais dire l'utilisateur tout court, celui qui utilise la page; anonyme ou pas.
Je voudrais que l'administrateur puisse entrer les renseignements (code postal et ville par ex.) pour un adhérent.
Or si l'administrateur est connecté pour gérer ses abonnés, le code Profile.CP="14200" lui impute CP=14200 à lui-même ! Je voudrais l'imputer à un adhérent de mon choix, choisi dans le role "Adhérents" par exemple.
Pour ce qui est du ProfileProvider, je continue à chercher dans ta direction.
merci
@+Gilles
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 10 janv. 2007 à 14:00
Ahh d'accord, j'avais pas compris
Tu dois pouvoir avoir ton bonheur avec les méthodes static de System.Web.Profile.ProfileManager tu dois avoir un findMember ou un truc du genre et ensuite modifier tout ca :-)
SuperBouly
Messages postés410Date d'inscriptiondimanche 1 février 2004StatutMembreDernière intervention 8 mai 2010 11 janv. 2007 à 09:27
Merci pour la pisteProfileManager.
Bon, en suivant la piste ProfileManager, j''ai trouvé la syntaxe, pour les internautes que ça intéresse, je la mentionne en fin de message.
Cependant le mécanisme me paraît bizarre :
J'ajoute un adhérent (UserName = "monAdherent") dans la table aspnet_user à l'aide d'un contrôle CreateUserWizard que je bricole en rajoutant 2 textbox tbCP et tbVille destinées à recevoir le Code Postal et la ville.
Tout marche bien, mais 2 lignes apparaissent dans la table aspnet_user, portant des UserId différents pour mon seul UserName Est-ce mon code qui provoque ça, ou est-ce normal !! J'aime autant dire que ça cree des problèmes d'affichage de requêtes dans les gridview!
Voici le code :
Protected Sub CreateUserWizard1_CreatedUser(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateUserWizard1.CreatedUser
'enregistrement du nouveau client
Dim sUser() As String = {CType(sender, CreateUserWizard).UserName}
Dim Rol As String = "Clients" 'un role "clients" a été défini par ailleurs
Roles.AddUsersToRole(sUser, Rol)
'adjonction des paramètres supplémentaires : Ville et CP
'1.lecture
Dim tbVille As TextBox = CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("tbVille")
Dim Ville As String = tbVille.Text
Dim tbCP As TextBox = CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("tbCP")
Dim CP As String = tbCP.Text
'2. définition du profil-utilisateur
'(EST-CE CECI QUI EST INCORRECT ?)
Dim MonUser As String = sUser(0)
Dim provi As ProfileProvider = ProfileManager.Provider
Dim prof As New ProfileBase
prof = ProfileBase.Create(MonUser)
'3 ecriture des valeurs dans ce profile
Dim NouvPValues As New SettingsPropertyValueCollection
Dim pvalues As SettingsPropertyValueCollection = provi.GetPropertyValues(prof.Context, ProfileBase.Properties)
For Each pval As SettingsPropertyValue In pvalues
Dim NouvValue As New SettingsPropertyValue(pval.Property)
If pval.Name = "CP" Then
NouvValue.PropertyValue = CP
ElseIf pval.Name = "Ville" Then
NouvValue.PropertyValue = Ville
End If
NouvPValues.Add(NouvValue)
Next
provi.SetPropertyValues(prof.Context, NouvPValues)
'OUF ceci, pour tout dire, me paraît laborieux et ne me paraît pas être une simplification de la vie, je dois trouver mieux !
@+Gilles
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 11 janv. 2007 à 10:18
Bonjour,
tu es dans l'évenement creatEDUser ... ton user est donc déjà créer, donc la ligne ProfileBase.Create("") est inutile ! Tu dois récuperer une instance de l'user en cours, peut etre qu'il est dans l'argument e ou dans le createuserwizard ou alors il faut peut etre utiliser une méthode findUserByName du profileProvider.
SuperBouly
Messages postés410Date d'inscriptiondimanche 1 février 2004StatutMembreDernière intervention 8 mai 2010 11 janv. 2007 à 14:59
ok, je me doutais...au flair
Mais la bonne commande *GetProfileByUserName n'est pas membre de profileBase mais de ProfileManager et je m'emmêle les crayons dans toutes ces classes, je dois repartir sur des bases + saines!
Je viens de voir que c'est très bien traité dans le gros et très bon bouquin (que je conseille même -surtout- aux débutants) de G.NICOT. Donc je me replonge.
Si je trouve le temps, je ferai une source, car ce serait un peu long ici.
@+Gilles
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 11 janv. 2007 à 17:49
Je viens de regarder dans Visual Studio (juste l'intelisense j'ai pas le temps de faire un test complet :s)
mais j'ai l'impression de m'etre gourré tout à l'heure, le ProfileBase.Create("toto"); ne créer pas un nouveau profile mais une nouvelle instance du profile pour l'utilisateur spécifié, d'après ce que j'ai compris cela permet de charger le profile spécifié à partir des infos de la base de données.
En ce qui concerne le code plus haut tu as du oublier le save et fais des trucs en trop. En gros je pense que :
Pour le bouquin je connais pas, et il me semble pas avoir encore vu un bon bouquin sur ASP.net 2.0 en francais ... moi j'ai lu les bouquins de Dino Esposito sur ASP.net 2.0 et ils sont vraiment très bien. Et il parle longuement des différents provider :-)
Bing2000
Messages postés18Date d'inscriptionlundi 28 octobre 2002StatutMembreDernière intervention12 mars 2007 12 mars 2007 à 10:51
Bonjour tout le monde
Moi j'ai une petite question. Je dois ajouter qlq 300 users à ma table aspnet_user. y-a-t-il un moyen générer manuellement le userid de facon a faire un simple copier/coller directement dans la table. j'ai pas envie de me taper les 300 par l'interface asp.net 2.0.
cs_emeraud
Messages postés1Date d'inscriptionlundi 16 juillet 2007StatutMembreDernière intervention16 juillet 2007 16 juil. 2007 à 14:09
Salut,
J'ai un question aussi. J'ai exactement le même problème. Deux utilisateurs ayant le meme nom sont crées.
J'ai essayé de faire pareil pour résoudre le problème. Hélas, ça ne marche pas chez moi ... je me retrouve avec cette erreur ci-dessous et je n'arrive pas à voir à quoi s'est du.
if
(
/*Profile.FavoriteColor*/(
String)p.GetPropertyValue(
"FavoriteColor") !=
"") -> Error generé
Error Description : The SSE Provider did not find the database file specified in the connection string. At the configured trust level (below High trust level), the SSE provider can not automatically create the database file.