2012-04-09 3 views
3

Ich habe einige Code verwendet, um festzustellen, ob ein Benutzer angemeldet ist, und ich möchte dies auf jeder Seite in einer ASP.NET-Website, so dass nur angemeldete Benutzer können es anzeigen. Das Problem besteht darin, dass die Website in mehrere Projekte/Lösungen aufgeteilt ist, so dass es schwierig sein könnte, den einzelnen Code zu behalten.Wo Authentifizierungsprüfung in ASP.NET

Ich dachte, ich könnte eine Klasse erstellen, die für System.Web.UI.Page erbt und überschreibt Page_Init, aber das würde erfordern alle Seiten ändern, so dass sie von neuen neuen Klasse erben. Ich denke auch nicht, dass dies projektübergreifend funktionieren wird.

Also dachte ich mir das Problem von einer anderen Seite zu nähern: mit AOP. Ich habe Aspects vorher noch nie benutzt, aber es sieht so aus, als könnte ich PostSharp verwenden, um einen Aspekt zu schreiben, der Code vor jedem Page_Init (oder vielleicht Page_Load?) Injiziert. Dies könnte als eine schnelle Lösung funktionieren, aber ich könnte Probleme bekommen, wenn ich eine Seite brauche, um die Authentifizierungsprüfung nicht durchzuführen (verfügbar für alle).

Nur um zu klären, habe ich bereits eine Login-Lösung; Ich suche nur nach einem Login auf jeder Seite.

+4

Warum verwenden Sie nicht einen ['MembershipProvider'] (http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx)? Dies alles wurde von ASP.NET für Sie erledigt. – jrummell

+2

Im Allgemeinen sollten ASP.NET-Seiten auf einer Masterseite erstellt werden, auf der gemeinsamer Code zentralisiert ist, einschließlich der Anmeldeprüfung. Sie könnten 2 Masterseiten erstellen, eine, die darauf prüft, und eine, die dies nicht tut. – MarioDS

+0

@jrummell das ist nicht flexibel genug. In realen Projekten kann man nicht auf Mitgliedschaftsprovider gehen, wenn man nach anpassbaren Projekten sucht. Recht? – Pankaj

Antwort

3

Schauen Sie in HttpModules. Das asp.net-Framework ist bereits so programmiert, dass ein Modul auf jeder Seitenanforderung ausgeführt wird, Sie müssen es nur schreiben und es zu web.config hinzufügen.

http://msdn.microsoft.com/en-us/library/zec9k340(v=vs.71).aspx

EDIT: Hier ist eine bessere Verknüpfung, die das Ereignis Beginrequest http://msdn.microsoft.com/en-us/library/ms227673(v=vs.85).aspx

+0

Nein, das System ist flexibel genug, um den Code für das gleiche in Code hinter zu schreiben, anstatt die Rollen in web.config explizit zu erwähnen. – Pankaj

+1

Sie geben die Rollen im Web nicht an.config, registrieren Sie einfach das Modul. Die Funktionsweise des Authentifizierungsmoduls liegt bei Ihnen selbst. Web.config sagt nur "Ausführen dieses Moduls für jede Seitenanforderung". – mafue

1

Wie @jrummell erwähnt, gibt es MembershipProvider, die eine gute Option ist demonstriert Handhabung, aber wenn Sie benutzerdefinierte Login solition erstellen, Überprüfen Sie diese link, die eine ziemlich einfache Login-Implementierung Schritt für Schritt hat

0

Windows Identity Foundation kann dies für Sie lösen. Details zu WIF finden Sie unter http://msdn.microsoft.com/en-us/security/aa570351. Keine Notwendigkeit, das Rad neu zu erfinden. Wenn Sie nur eine Webanwendung hätten, würde die Formularauthentifizierung ausreichen.

1

Da Sie Ihre Anmeldelösung scheinbar bearbeitet haben und funktionieren, klingt das Erstellen einer Klasse, die page_init außer Kraft setzt, wie Ihre beste Option. Dies kann für andere Projekte funktionieren, indem Sie diese Klasse in einem separaten Projekt erstellen, das Sie in Ihre anderen Lösungen einfügen können. Um ehrlich zu sein, ist dies der einfachste Weg, die Logik über mehrere Projekte hinweg zu überbrücken leicht zu warten, da Sie nur einen Standort für die Zukunft aktualisieren müssen.

Wenn Sie MasterPages verwenden, müssen Sie nicht alle Seiten ankreuzen, Sie können sie einfach auf bestimmte MasterPage (s) einfügen und alle Seiten festlegen, für die die Authentifizierung die MasterPage verwenden soll.