2009-07-18 4 views
3

Mein Problem ist ziemlich einfach - denke ich. Ich mache ein ASP.NET MVC-Projekt. Bei diesem Projekt muss der Benutzer jederzeit angemeldet sein. Ich brauche wahrscheinlich die aktuellen Benutzerinformationen in der MasterPage, so; "Hallo, Mark - du bist eingeloggt!"Benutzerdaten für jede Anfrage abrufen

Aber was, wenn ich die gleichen Informationen in der Ansicht brauche? Oder eine Validierung in meinem Service-Layer?

Wie kann ich sicherstellen, dass diese Informationen verfügbar sind, wenn ich sie brauche und wo ich sie brauche?

Antwort

2

Wie viele Benutzerinformationen benötigen Sie? Sie können immer auf Thread.Current.Principal zugreifen und den Namen des Benutzers abrufen - und möglicherweise diesen verwenden, um weitere Informationen über den Benutzer in einer Datenbank abzurufen.

Oder wenn Sie wirklich wirklich einige Informationen zu jeder Zeit brauchen, könnten Sie Ihre eigenen benutzerdefinierten Prinzip von IPrincipal (das ist wirklich keine große Sache!), Und fügen Sie diese Informationen dort und wann Der Benutzer meldet sich an, erstellt eine Instanz von MyCustomPrincipal und hängt diese an den aktuellen Thread an. Dann ist es überall, jederzeit und überall verfügbar.

Marc

1

Ich hatte genau das gleiche Problem und muss noch eine befriedigende Antwort finden. Alle Optionen, die wir untersucht haben, hatten verschiedene Probleme. In dem speziellen Beispiel, das Sie erwähnen, könnten Sie diese Daten natürlich in der Sitzung speichern, da dies für das Beispiel funktionieren würde. Es könnte andere Szenarien geben, die wir hatten, wo das vielleicht nicht funktioniert, aber einfache Benutzerinformationen wie diese wären in der Sitzung in Ordnung.

Wir haben gerade einen BaseController eingerichtet, der sicherstellt, dass Informationen für jede Ansicht immer korrekt gesetzt und korrekt sind. Je nachdem, wie Sie mit der Authentifizierung umgehen, stehen Ihnen in HttpContext.User.Identity.Name immer einige Benutzerdaten zur Verfügung. Welche können auch referenziert werden.

0

Erstellen Sie eine Hierarchie Ihrer Modelle und fügen Sie die gemeinsamen Informationen in das Basismodell ein. Auf diese Weise wird es für jede Ansicht oder Teilansicht verfügbar sein.

Natürlich muss es bei jeder Anfrage abgerufen werden, da Web-Anwendungen nicht persistent sind.

0

Sie sollten dies in Session speichern und über einen benutzerdefinierten ModelBinder in Ihre Controller abrufen.

+0

Das einzige Problem, bei dem Probleme mit der Sitzung aufgetreten sind, sind Daten, die je nach Bereich der Website variieren können. Zum Beispiel haben wir eine Reihe von Ligen in einer unserer Apps, wo manchmal die Benutzer kann ein Manager sein, manchmal nicht. Wir müssen speichern, ob ein Benutzer in der Sitzung verwaltet wird. Dies funktioniert gut, bis Sie mehrere Tabs geöffnet haben, und dann wird alles sehr unordentlich. So funktioniert es für Login-Informationen, aber fällt, wenn Sie beginnen, es für andere Daten möglicherweise zu verwenden. – pauldunlop

+0

Können Sie diesen Teil Ihres Problems genauer erklären? Es klingt, als ob Sie Ihr Anmeldemodell mithilfe von Rollen stärker verknüpfen möchten. –

+0

Es ist nicht ganz so einfach, wir haben einen einzelnen Benutzer, der mehrere Rollen in verschiedenen Elementen der Site haben kann. Der Vorschlag von marc_s könnte dieses Problem für uns lösen. Wir spielen etwas damit, um zu sehen, ob es eine gute Lösung bietet. – pauldunlop

0

nicht sicher, ob ich bekommen, was Sie fragen wollen, aber wenn Sie für Dinge wie Authentifizierung und rollenbasierte Autorisierung suchen, tatsächlich ASP.net einen großen Rahmen bieten, die Arbeit an/Start mit .

Diese article (mit auch 2. Teil) ist etwas, das ich vor kurzem entdeckt und gelesen habe, über das ist wirklich gut mit dem Provider-Muster beginnen, die das zugrundeliegende Authentifizierungs-Framework von ASP.net zu verstehen. Lesen Sie auch die MembershipProvider-Klasse und die RoleProvider-Klasse in msdn. Sie bilden zusammen ein hervorragendes Framework für die meisten grundlegenden rollenbasierten Authentifizierungen, mit denen Sie arbeiten können (wenn Sie mit der von Ihnen bereitgestellten Funktion vertraut sind) code data-access part, alle sind in der Standardimplementierung enthalten!)

PS: Checkt auch die Context.Users-Eigenschaft aus! Es speichert die aktuellen authentifizierten Benutzerinformationen.

0

HttpContext.Current.Users.Identity gibt die aktuellen Benutzerinformationen zurück. Obwohl ich nicht sicher bin, ob es bei einem Webservice-Aufruf implizit übergeben wird.