2010-06-18 4 views

Antwort

18

Sie haben keinen Zugriff auf das Benutzerobjekt, da die Anforderung noch nicht authentifiziert wurde.

Versuchen Sie stattdessen, Application_AuthenticateRequest zu verwenden. Hier

ist eine Erklärung aller Global.asax Ereignisse: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5771721.html

Und die MSDN Durchlauf des Anwendungslebenszyklus: http://msdn.microsoft.com/en-us/library/ms178473.aspx

Edit: Ich sehe, was du tust. Ändern Sie Ihre if-Anweisung und wenn nicht-Anweisung (sorry, wenn Syntax falsch ist, ich verwende VB.NET nicht):

Sub Application_AuthenticateRequest() 
    If Context.User <> Nothing Then 
     Throw New Exception("User now exists") 
End Sub 

Sie werden bemerken, dass diese Methode mehr getroffen wird als einmal. Die Ausnahme wird erst zum zweiten oder dritten Mal ausgelöst. Dies liegt daran, dass jede Anfrage dem Anwendungslebenszyklus folgt. Anstatt also die Aktion auszuführen, wenn der Benutzer null ist, sollten Sie sie ausführen, wenn der Benutzer nicht null ist.

Wenn Ihr Ziel ist dynamisch Zugang zu beschränken, sollten Sie eine separate Httpmodule erstellen und zuweisen, um die Dateien, die Sie

Allerdings sind zu beschränken, müssen Sie vorsichtig sein, nicht Umschreiben des gesamten zu übernehmen ASP.NET Application Security-Infrastruktur. Sie können stattdessen den Zugriff auf bestimmte Ordner basierend auf der Rolle einschränken.

+0

Bitte überprüfen Sie meinen Kommentar in der anderen Antwort von Julien ... http://stackoverflow.com/questions/3072768/net-application-beginrequest-how-to-get-Benutzer-Referenz/3072801 # 3072801 – Ropstah

+0

ropstah: Ich sehe jetzt, was passiert. Die Anwendung führt mehrere Anforderungen aus (z. B. für Bilder, Skripts, Stylesheets usw.), bevor die Authentifizierungsanforderung verarbeitet wird. Diese anderen Dateianforderungen benötigen möglicherweise keine Authentifizierung und deshalb wird Ihre Ausnahme ausgelöst. Versuchen Sie das Update in meiner Antwort und sehen Sie, ob das klärt. Was versuchen Sie mit Ihrem Code, der das User-Objekt benötigt? –

+0

Dies war nicht der Fall, jedoch ** war ** mit dem 'Global.asax'-Lebenszyklus verbunden. Ich benötigte die 'User.IsInRole()' Funktionalität, die erst ** nach ** _Application_AuthenticateRequest_ in der Prozedur 'Application_AuthorizeRequest()' verfügbar war – Ropstah

8

Nein, Sie müssen stattdessen Application_AuthenticateRequest verwenden. Das ist der früheste Punkt, an dem Sie einen Benutzer haben.

+0

Dies wirft eine Ausnahme, immer noch kein Benutzer oder was? Sub Application_AuthenticateRequest() Wenn Context.User nichts ist, dann neue Exception werfen ("No user") End Sub – Ropstah