2012-12-11 9 views
7

Mam mój własny system uwierzytelniania (https://bitbucket.org/anton_gogolev/octalforty-structural), który nie używa żadnego ze standardowych elementów ASP.NET (<authentication mode="None" />).Całkowicie niestandardowe uwierzytelnianie w ASP.NET MVC: utrata HttpContext.User

Wykorzystuje zwykły IHttpModule s, aby wykonywać swoje zadania: BeginRequest sprawdza przychodzące ciasteczka i ustawia HttpContext.Current.User i Thread.CurrentPrincipal po pomyślnym uwierzytelnieniu

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

natomiast EndRequest wystawianiu wszystkie wymagane pliki cookie dla uwierzytelnionego użytkownika.

Zostało to działa dobrze przez kilka miesięcy teraz, ale na niektórych systemach (a ja naprawdę nie można powiedzieć, w jaki sposób są one różne od tych, to faktycznie działa na ) ASP.NET zdaje się tracić wartość HttpContext.Current.User, zastępując go z dowolnymi wartościami domyślnymi (GenericPrincipal agregacja z IsAuthenticated ustawiona na false itd.).

Pytanie brzmi: jak i dlaczego HttpContext.Current.User się gubi?

+0

Mam ten sam problem. Jakieś rozwiązanie? –

+0

Więcej szczegółów na temat objawów? Czy zdarza się to jednemu użytkownikowi lub wielu? Czy w systemach, których dotyczy ten problem, użytkownik traci za każdym razem lub tylko przez pewien czas, a jeśli tak, to w jakim czasie? –

Odpowiedz

2

Wygląda na to, że istnieje inny moduł modyfikujący HttpContext.Current.User po BeginRequest. Polecam ustawienie zamiast tego w PostAuthenticateRequest.

Miałem już ten problem z ASP.NET włączanie modułu RoleManager. Dodanie następujących elementów do sekcji system.web w web.config naprawiło to.

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

Oto niektóre wzmacniający informacje o tym, co zrobiłem, aby rozwiązać ten problem:

1) Dowiedzieć się, jakie inne moduły są uruchomione. Oto article, który zapewnia pewien kod do robienia tego.

2) Upewnij się, że ustawiłeś HttpContext.Current.User we właściwym miejscu. BeginRequest nie jest dobrym miejscem do przechwycenia. PostAuthenticateRequest jest zwykle najlepszym (i zalecanym). Nie zapobiegnie to problemowi, jeśli inny moduł również używa PostAuthenticateRequest i zdarza się, że jest uruchamiany po twoim, ale w wielu przypadkach rozwiąże problem (użyj fragmentu web.config powyżej).

3) Wyłącz selektywnie każdy zainstalowany moduł i przetestuj aplikację, dopóki niestandardowy obiekt główny nie zostanie nadpisany.

Powiązane problemy