2010-12-23 9 views
3

Im Denken des Erhaltens Benutzername von meiner Seite mit dieser meiner Meinung nach (Razor-Syntax) gesetzt ist:bekommen Benutzername, die in Userdata von FormsAuthenticationTicket

@MySite.Helpers.Utils.UserName 

here die utils Klasse:

public class Utils 
{ 
    static FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 

    public static string UserName { get { return id.Ticket.UserData; } } 
} 

Sind Gibt es irgendwelche Probleme mit diesem Code?

Der Grund Im es, wie dies zu tun ist, weil Im Benutzernamen in das Feld Userdata eines neuen FormsAuthenticationTicket, wenn sich der Benutzer anmeldet.

ich es so speichern gehe Handhabung, weil Im mit Facebook verbinden und wollen Speichern Sie dort ID in das Feld Benutzername in der Datenbank und ihre Benutzernamen/fullnames in einer separaten Tabelle.

so meine Logik, facebook Benutzernamen und meine Website-registrierte Benutzernamen zu handhaben muss anders behandelt werden. Beim Anmelden denke ich daran, es dort zu behandeln, und setze dann userdata als den tatsächlichen Benutzernamen.

daher in der gesamten Website kann ich nur die eingeloggte Benutzer erhalten Name: @MySite.Helpers.Utils.UserName

klingt das ok? Wird die Tatsache, dass es sich um eine statische Variable handelt, ein Problem sein?

oder gibt es eine bessere Möglichkeit, dies zu verwalten? Sitzungsvariablen vielleicht?

dank

+1

Ich bin mir ziemlich sicher, dass 'id' als statische Variablen gespeichert werden Sie Probleme verursachen . Machen Sie es stattdessen zu einer Eigenschaft. –

+0

@jbinto, das ist eine ungenaue Anweisung, da der Op den Wert von id über das HttpContext.Current-Objekt an die kontextabhängige Instanz zur Laufzeit gebunden hat. Mit der Art und Weise, wie @raKlos dies codiert hat, können Sie während der Laufzeit auf die ID nur für die aktuelle Anfrage zugreifen, wenn Sie sich in einem Zustand befinden, in dem Sie keinen Zugriff auf HttpContext.Current haben. –

Antwort

1

The reason Im doing it like this is because Im going to store username in the userdata field of a new FormsAuthenticationTicket when the user logs in.

Der Benutzername des aktuell angemeldeten Benutzers ist bereits in der Authentifizierungs-Cookie gespeichert. Sie müssen es nicht noch einmal in den UserData speichern. Und um es in Ihrer Razor Vorlage abrufen kann man einfach:

@User.Identity.Name 

Offensichtlich ist es empfehlenswert, die Controller-Aktion macht diese Ansicht mit dem [Authorize] Attribute dekorieren, um sicherzustellen, dass ein Benutzer, bevor er Zugriff authentifiziert ist oder Sie könnte Holen Sie sich eine NullReferenceException mit diesem Code.

Als Alternative Sie einen Helfer schreiben konnte:

public static MvcHtmlString Username(this HtmlHelper htmlHelper) 
{ 
    var identity = htmlHelper.ViewContext.HttpContext.User.Identity; 
    if (identity.IsAuthenticated) 
    { 
     return MvcHtmlString.Create(identity.Name); 
    } 
    return MvcHtmlString.Empty; 
} 

, die Sie wie folgt verwenden:

@Html.Username() 
+0

Das ist mir klar, aber ich erkläre weiter, warum ich es dort aufbewahre. Meine Facebook-Nutzernamen werden in einer anderen Tabelle gespeichert. Ich möchte im Grunde eine einfache Möglichkeit, den Benutzernamen zu erhalten, wenn es ein Facebook-Benutzer oder eine Website registrierte Benutzer ist. – raklos

+0

@raklos, also ist der in den UserData gespeicherte Benutzername nicht der gleiche wie der im Authentifizierungscookie gespeicherte Benutzername, d. H. Der aktuell angemeldete Benutzer unterscheidet sich von dem in der UserData-Eigenschaft gespeicherten Benutzer? –

+0

@Darin - Personen, die sich auf meiner Website registrieren - @ User.Identity.Name gibt den Benutzernamen an.Personen, die sich unter facebook @ User.Identity.Name registrieren, erhalten ihre Facebook-ID - eine Reihe von Zahlen. Ihre Namen sind in einer separaten Tabelle gespeichert. Ich möchte nahtlos in der Lage sein, den Benutzernamen auf eine Weise zu erhalten, weshalb ich überlege, es in UserData zu setzen. – raklos

Verwandte Themen