2009-06-29 11 views
23

Hallo Ich benutze einen benutzerdefinierten MembershipProvider.HttpContext.Current.User.Identity.Name ist immer string.Empty

Ich möchte den aktuellen Benutzernamen während eines Anwendungsszenarios kennen, aber wenn ich versuche, auf HttpContext.Current.User.Identity.Name zuzugreifen, gibt es immer string.Empty zurück.

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text)) 
{ 
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true); 
    bool x = User.Identity.IsAuthenticated; //true 
    string y = User.Identity.Name; //"" 
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked); 
} 

Fehle ich etwas?

+0

dieser Code scheint einfach genug. Sind Sie sicher, dass der Benutzer authentifiziert ist? Irgendwelche witzigen Geschäfte mit dem Anbieter dynamisch ändern oder einige solche? –

+0

no funny bizniz ,, Benutzer ist authentifiziert – Shimmy

+0

Haben Sie den Benutzernamen im Authentifizierungscookie mit FormsAuthentication.SetAuthCookie festgelegt? –

Antwort

34
FormsAuthentication.SetAuthCookie(tbUsername.Text, true); 
bool x = User.Identity.IsAuthenticated; //true 
string y = User.Identity.Name; //"" 

Das Problem, das Sie haben, ist an dieser Stelle Sie nur das Authentifizierungscookie Einstellung, die IPrincipal, die innerhalb des Formularauthentifizierungsmodul erstellt wird, wird nicht passieren, bis es eine neue Anforderung ist - so an diesem Punkt die Httpcontext . Benutzer ist in einem seltsamen Zustand. Sobald die Weiterleitung erfolgt, wird der Cookie gelesen, bevor die Seite erreicht wird und das korrekte Benutzerobjekt erstellt wurde, da es sich um eine neue Anfrage des Browsers handelt.

Cookies werden nur im Browser gesetzt, nachdem eine Anfrage abgeschlossen wurde.

Als Neben RedirectFromLoginPage ein Cookie Formen Auth schafft sowieso, Sie brauchen nicht manuell Bitte

+0

das ist ein guter Punkt. Testen Sie den Benutzernamen auf derselben Seite, auf der der Cookie gesetzt ist/wird die Anmeldung durchgeführt? Wenn ja, überprüfen Sie HttpContext.Current.User.Identity auf einer * nachfolgenden * Seite. –

+0

sehr nette Antwort. Aber das hilft mir nicht sehr bei meinem Problem. Ich möchte den Benutzer basierend auf der Rolle des Benutzers auf eine bestimmte Seite umleiten können. Ein Admin direkt an Admin-Panel, ein normaler Benutzer, Seite zu begrüßen, ein fortgeschrittener Benutzer zu einer bestimmten anderen Seite ... Ich hoffte, User.IsInRole() zu verwenden, um das ActionResult der LogOn-Aktionsmethode zu bestimmen ... aber es ist "in ein komischer Zustand "wie du es ausdrückst :-) –

0

Wenn Sie den Namen des Benutzers aus der Mitgliedschaft Anbieter, versuchen so etwas wie dieses ...

var user = Membership.GetUser(HttpContext.Current.User.Identity.Name); 
+2

Wenn ich den Benutzer lieber den Benutzernamen brauche, dann könnte ich einfach Membership.GetUser(); : <| – Shimmy

8

Der Wert von HttpContext.Current.User.Identity.Name wird durch den Aufruf von RedirectFromLoginPage suchen. Sie können die aktuelle Benutzer-ID von HttpContext.Current.User.Identity.Name abrufen, sobald Sie auf eine neue Seite umgeleitet werden. Ich bin mir nicht sicher, warum Sie in diesem Kontext über die User-Eigenschaft auf den Benutzernamen zugreifen müssen. Können Sie nicht einfach den in tbUsername.Text enthaltenen Wert verwenden?

19

zu tun versuchen System.Web.HttpContext.Current.Request.LogonUserIdentity.Name statt User.Identity.Name. Es hat für mich funktioniert.

+1

Das ist etwas anderes. Wenn ich diesen Wert auf meiner Website lese, bekomme ich mein Windows-Konto (AD) ... – Jowen

+1

Wenn User.Identity.Name leer ist und Sie erwarten, dass es nicht sein wird, aber LogonUserIdentity.Name nicht, dann haben Sie möglicherweise ein Problem mit Ihrer applicationhost.config, wenn Sie aus Visual Studio debuggen. Siehe meine SO Frage für weitere Informationen. http://StackOverflow.com/Questions/19686933/logonuseridentity-name-vs-user-identity-name/19689343#19689343 – Jagd

+0

Ja, ich stimme mit Jowen .. Das ist nicht die gleiche Identität wie gefragt wurde für ... aber Es ist cool, dass zugänglich ist, nehme ich an. – ppumkin

1

Wie bereits vorgeschlagen FormsAuthentication.RedirectFromLoginPage() Methode, setzt die Authentifizierung Cookie automatisch.

In meinem Fall hatte ich jedoch verschachtelte Web-Anwendungen, wo ich <httpModules> Tag in Kind-Anwendung (so dass es httpModules von seiner übergeordneten Anwendung erbt) in der web.config Datei gelöscht wurde. Das Entfernen der unerwünschten übergeordneten httpModule hat alles wieder funktioniert.

seine besser dieses Tag vor komplizieren Dinge zu überprüfen :)

0

Wenn Sie URL-Rewrite oder ändern Sie Ihre URL verwenden, kann es Ursache Rückkehr Leer Null value.You sollte von Änderungspfad Ihrer URL versuchen. html zu .aspx oder keine Erweiterung. Dies ist ein Problem für meinen Fall.Sie versuchen.Ich hoffe, dass diese nützliche

2

in VS Community 2015-Version, wenn Sie eine Webformular-Anwendung erstellen, fügt sie automatisch Codes in Web.config-Knoten, um FormsAuthentication zu entfernen, versuchen, entfernen Sie unter Abschnitt

<modules> 
    <remove name="FormsAuthentication"/> 
</modules>