2008-09-28 13 views
16

Wie kann ich in der ASP.NET-Mitgliedschaft auf UserId zugreifen, ohne Membership.GetUser(username) im ASP.NET-Webanwendungsprojekt zu verwenden?Wie kann ich auf UserId in der ASP.NET-Mitgliedschaft zugreifen, ohne Membership.GetUser() zu verwenden?

Kann UserId in Profile Namensraum neben UserName (System.Web.Profile.ProfileBase) enthalten sein?

+0

Können Sie den Grund warum erweitern? – Kev

+1

Wenn ich Membership.GetUser() anrufe.ProviderUserKey wird immer aufgerufen Aufruf an die DB, um diese UserId abzurufen – GrZeCh

Antwort

4

Ich entschied mich, die Authentifizierung der Benutzer Benutzer selbst zu schreiben (sehr einfach, aber es funktioniert), und ich sollte dies vor langer Zeit getan.

Meine ursprüngliche Frage war über Benutzer-ID und es ist nicht verfügbar ab:

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

Im Anschluss an Ihren Beitrag, wenn Sie mit Microsoft.AspNet.Identity importieren; Sie haben Zugriff auf User.Identity.GetUserId() –

13

Haben Sie den Grund, einen Datenbankaufruf zu speichern, wenn Sie die UserId benötigen? Wenn dies der Fall ist, verwende ich normalerweise den ASP.NET-Mitgliedschaftsanbieter entweder einen benutzerdefinierten Anbieter, der es mir ermöglicht, diesen Aufruf zwischenzuspeichern, oder eine Hilfsmethode, die ich zwischenspeichern kann.

Wenn Sie daran denken, es in das Profil zu setzen, sehe ich nicht viel Grund dafür, zumal es auch noch einen Datenbankanruf erfordert und es sei denn, Sie verwenden einen benutzerdefinierten Profilanbieter dort die zusätzliche Verarbeitung zum Aussortieren der UserId.

Wenn Sie sich fragen, warum sie eine GetUserId-Methode nicht implementiert haben, liegt es einfach daran, dass Sie nicht immer garantieren können, dass diese Benutzer-ID eine GUID wie im mitgelieferten Provider sein wird.

EDIT:

See ScottGu's article on providers, die eine link to downloading the actual source code for i.e. SqlMembershipProvider bietet.

Aber die einfachste Sache zu tun ist eine GetUserId() - Methode in Ihrem Benutzerobjekt oder Dienstprogramm-Klasse, wo Sie die UserId aus dem Cache/Sitzung, wenn dort, die Datenbank schlagen, Cache nach Benutzername (oder speichern in Sitzung), und geben Sie es zurück.

Für etwas mehr zu betrachten (aber sehr vorsichtig sein, da der Cookie-Größenbeschränkungen): Forms Auth: Membership, Roles and Profile with no Providers and no Session

+0

Netter kleiner Artikel am Ende Ihrer Antwort. –

0

Sie haben zwei Möglichkeiten:

1) Verwenden Sie Benutzernamen als Primärschlüssel für Ihre Benutzerdatentabelle dh:

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

2) Fügen Sie dem Profil Benutzer-ID hinzu.

Es gibt Vor-und Nachteile für jede Methode. Persönlich bevorzuge ich das erste, weil es bedeutet, dass ich nicht unbedingt den Standard-Profilanbieter einrichten muss, und ich bevorzuge es trotzdem, eindeutige Benutzernamen in meinen Systemen zu erzwingen.

0

Andrew: Ich würde vorsichtig sein, eine Abfrage wie die, die Sie angezeigt haben, als Standard, gibt es keinen Index, der damit übereinstimmt, so dass Sie das Risiko einer vollständigen Tabelle Scan. Wenn Sie die Benutzerdatenbank für mehr als eine Anwendung verwenden, haben Sie darüber hinaus die Anwendungs-ID nicht angegeben.

Der nächste Index ist aspnet_Users_Index, der die ApplicationId und LowedUserName erfordert.

EDIT:

Oops - nachzulesen Andreas Post und er ist kein select * auf der aspnet_Users Tabelle zu tun, sondern vielmehr eine eigenes Profil/Benutzertabelle der Benutzername als Primärschlüssel verwendet wird.

0

Haben Sie versucht, System.Web.HttpContext.Current.User.Identity.Name zu verwenden? (Stellen Sie sicher, dass User und Identity zuerst nicht null sind.)

0
{ 
MembershipUser m = Membership.GetUser(); 
Response.Write("ID: " + m.ProviderUserKey.ToString()); 
} 

Werden Sie die Benutzer-ID geben (unique) für den aktuellen Benutzer aus der aspnet_Membership Tabelle - die aktuelle Bereitstellung erfolgreich angemeldet Wenn Sie versuchen, <% =%> oder diesen Wert vor einer erfolgreichen Authentifizierung zuweisen, erhalten Sie den Fehler "Objektverweis nicht auf eine Instanz eines Objekts festgelegt".

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

22

Try this:

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

Das Eingeben des Benutzernamens hilft sicherlich, da ich sonst null zurückbekomme! Danke dafür. –

0

Ich hatte dieses Problem, die Lösung in der web.config-Konfiguration ist, versuchen web.config mit diesen konfigurieren:

<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> 
2

Try die folgenden:

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