Comment puis-je accéder à UserId dans une adhésion ASP.NET sans utiliser Membership.GetUser ()?

StackOverflow https://stackoverflow.com/questions/146896

Question

Comment puis-je accéder à UserId dans l'appartenance à ASP.NET sans utiliser Membership.GetUser(username) dans le projet d'application Web ASP.NET?

Peut-on Profile être inclus dans UserName l'espace de noms à côté de System.Web.Profile.ProfileBase (<=>)?

Était-ce utile?

La solution 3

J'ai décidé d’écrire moi-même l’authentification des utilisateurs utilisateurs (très simple mais cela fonctionne) et j’aurais dû le faire depuis longtemps.

Ma question initiale concernait UserId et n'est pas disponible à partir de:

System.Web.HttpContext.Current.User.Identity.Name

Autres conseils

Essayez ceci:

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);

Pourquoi avez-vous enregistré un appel à la base de données chaque fois que vous avez besoin de l’ID utilisateur? Si tel est le cas, lorsque j'utilise ASP.NET MembershipProvider, je crée généralement un fournisseur personnalisé qui me permet de mettre cet appel en cache, ou une méthode utilitaire que je peux mettre en cache.

Si vous envisagez de le placer dans le profil, je ne vois pas beaucoup de raisons de le faire, d'autant plus que cela nécessitera également un appel à la base de données et, à moins que vous n'utilisiez un fournisseur de profil personnalisé, ajout du traitement de l'analyse de l'identifiant utilisateur.

Si vous vous demandez pourquoi ils n'ont pas implémenté de méthode GetUserId, c'est simplement parce que vous n'êtes pas toujours assuré que cet ID utilisateur sera un GUID comme dans le fournisseur inclus.

EDIT:

Voir l'article de ScottGu sur les fournisseurs , qui fournit une lien pour télécharger le code source actuel pour SqlMembershipProvider .

Mais la chose la plus simple à faire est vraiment une méthode GetUserId () dans votre objet utilisateur ou votre classe d’utilitaire, où vous obtenez le UserId à partir de cache / session s’il existe, sinon tapez sur la base de données, mettez-la en cache par nom d’utilisateur (ou stockez-la dans session) et le renvoyer.

Pour en savoir plus (mais soyez très prudent à cause des restrictions de taille de cookie): Autorisation des formulaires: appartenance, rôles et profil sans fournisseur ni session

Essayez ce qui suit:

Membership.GetUser().ProviderUserKey
public string GetUserID()
            {
                MembershipUser _User;
                string _UserId = "";
                _User = Membership.GetUser();
                Guid UserId = (Guid)_User.ProviderUserKey;
                return _UserId = UserId.ToString();
            }

Vous avez deux options ici:

1) Utilisez le nom d'utilisateur comme clé primaire pour votre table de données utilisateur. c'est-à-dire:

select * from [dbo.User] where Username = 'andrew.myhre'

2) Ajoutez un ID utilisateur au profil.

Il existe des avantages et des inconvénients pour chaque méthode. Personnellement, je préfère le premier, car cela signifie que je n'ai pas nécessairement besoin de configurer le fournisseur de profil prêt à l'emploi, et que je préfère quand même appliquer des noms d'utilisateur uniques à mes systèmes.

Andrew: Je ferais attention à ne pas faire une requête comme celle que vous avez indiquée par défaut. Comme aucun index ne correspond à cela, vous courez le risque d'une analyse complète de la table. De plus, si vous utilisez votre base de données d'utilisateurs pour plusieurs applications, vous n'avez pas inclus l'ID d'application.

L'index le plus proche est aspnet_Users_Index, qui requiert les identificateurs ApplicationID et LoweredUserName.

EDIT:

Oops - relisez le message d'Andrew et il ne fait pas select * sur la table aspnet_Users, mais plutôt une table de profil / utilisateur personnalisée utilisant le nom d'utilisateur comme clé primaire.

J'ai eu ce problème, la solution se trouve dans la configuration web.config, essayez de configurer web.config avec les éléments suivants:

 <roleManager
             enabled="true"
             cacheRolesInCookie="true"
             defaultProvider="QuickStartRoleManagerSqlProvider"
             cookieName=".ASPXROLES"
             cookiePath="/"
             cookieTimeout="30"
             cookieRequireSSL="false"
             cookieSlidingExpiration="true"
             createPersistentCookie="false"
             cookieProtection="All">
  <providers>
    <add name="QuickStartRoleManagerSqlProvider"
        type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        connectionStringName="ASPNETDB"
        applicationName="SecurityQuickStart"/>
  </providers>
</roleManager>
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

Vous donnera le nom d'utilisateur (identifiant unique) de l'utilisateur actuel dans la table aspnet_Membership, à condition que le compte actuel soit connecté. Si vous essayez de <% =% > ou attribuez cette valeur avant une authentification réussie, vous obtiendrez l'erreur " référence d'objet non définie à une instance d'objet " ;.

http: //www.tek-tips .com / viewthread.cfm? qid = 1169200 & amp; page = 1

Avez-vous essayé d'utiliser System.Web.HttpContext.Current.User.Identity.Name? (Assurez-vous de vérifier que User et Identity sont d'abord non nuls.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top