2012-12-11 9 views
7

Ich habe meine eigenen Authentifizierung System (https://bitbucket.org/anton_gogolev/octalforty-structural), die keine der Standard ASP.NET Sachen (<authentication mode="None" />) verwendet.Vollständig benutzerdefinierte Authentifizierung in ASP.NET MVC: verlieren HttpContext.User

Es nutzt Ebene IHttpModule s seine Arbeit zu tun: BeginRequest prüft eingehende Cookies und setzt HttpContext.Current.User und Thread.CurrentPrincipal bei erfolgreicher Authentifizierung

Thread.CurrentPrincipal = HttpContext.Current.User = 
    new GenericPrincipal(tokenIdentity,new string[] { }); 

während EndRequest Fragen alle erforderlichen Cookies für einen authentifizierten Benutzer.

Dies wurde nun für Monate fein gearbeitet, aber auf manchen Systemen (und ich kann wirklich nicht sagen, wie sie von verschieden sind, diese tatsächlich funktioniert auf) ASP.NET scheint den Wert HttpContext.Current.User verlieren zu werden, sie zu ersetzen mit welchen Standardwerten auch immer sind (GenericPrincipal aggregieren GenericIdentity mit IsAuthenticated auf false gesetzt, usw.).

Also die Frage ist: wie und warum ist HttpContext.Current.User verloren?

+0

Ich habe das gleiche Problem. Irgendeine Lösungsmöglichkeit? –

+0

Weitere Details zu den Symptomen? Kommt es für einen oder mehrere Benutzer vor? Verliert es auf den betroffenen Systemen den Benutzer jedes Mal oder nur zu einem bestimmten Zeitpunkt und nur manchmal, wie oft? –

Antwort

2

Es klingt wie es gibt ein anderes Modul, das HttpContext.Current.User nach BeginRequest ändert. Ich würde empfehlen, es stattdessen in PostAuthenticateRequest zu setzen.

Ich hatte dieses Problem zuvor mit ASP.NET das RoleManager-Modul aktiviert. Das Hinzufügen des folgenden zum system.web Abschnitt von web.config hat es behoben.

<httpModules> 
    <remove name="RoleManager"/> 
</httpModules> 

Hier einige Verstärkungs Informationen über das, was ich tat, um dies zu beheben:

1) Finde heraus, was andere Module ausgeführt werden. Hier ist ein article, der einen Code dafür bereitstellt.

2) Stellen Sie sicher, dass Sie HttpContext.Current.User an der richtigen Stelle einstellen. BeginRequest ist kein guter Ort zum Einhängen. PostAuthenticateRequest ist normalerweise das beste (und empfohlen). Dadurch wird das Problem nicht verhindert, wenn ein anderes Modul auch PostAuthenticateRequest verwendet und es zufällig nach Ihrem ausgeführt wird. In vielen Fällen wird das Problem jedoch behoben (verwenden Sie das obige web.config-Snippet).

3) Deaktivieren Sie jedes installierte Modul selektiv und testen Sie Ihre Anwendung, bis das benutzerdefinierte Principal-Objekt nicht überschrieben wird.

Verwandte Themen