W aplikacji ASP.net używam formantu Login z niestandardowym dostawcą członkostwa, który napisałem. Co chcę zrobić, to ustawić Thread.CurrentPrincipal
do mojego niestandardowego obiektu głównego, zaraz po uwierzytelnieniu użytkownika.Jak ustawić Thread.CurrentPrincipal do użytku w całej aplikacji?
Używam settera: Thread.CurrentPrincipal
i ustawia on dla mnie obiekt główny, ale na wszystkich następnych wątkach ta właściwość CurrentPrincipal jest nadpisywana domyślną.
Oto mój kod dla zdarzenia Authenticate kontroli logowanie:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string username = Login1.UserName;
string password = Login1.Password;
if (Membership.ValidateUser(username, password))
{
var login = sender as Login;
var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true);
var principal = new PhoenixPrincipal(phoenixIdentity);
Thread.CurrentPrincipal = principal;
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
HttpContext.Current.User = principal;
e.Authenticated = true;
}
}
Na przykład, wyobraźmy sobie, że mogę się zalogować przy użyciu nazwy użytkownika A, wszystko idzie dobrze ... przechodzi walidacji, ale hardcode użytkownikowi z nazwą użytkownika B w obiekcie tożsamości, który jest ustawiony na główny obiekt, który ustawiłem jako obiekt CurrentPrincipal
.
Kiedy sprawdzić, który użytkownik jest ustawiony na CurrentPrincipal
Tożsamości pod koniec tej metody to mówi, że to użytkownik B. Ale gdy załadować kolejną stronę, a następnie sprawdzić, co Tożsamość CurrentPrincipal
jest, to mówi, że to użytkownik A.
Co zrobić, aby mój obiekt CurrentPrincipal
był trwały we wszystkich innych wątkach i gdzie/kiedy ta kontrola logowania ustawi obiekt CurrentPrincipal
wątku?
Co robisz? Czy chcesz, aby wszyscy byli identyfikowani jako pierwszy zalogowany użytkownik? Musisz zrozumieć mechanizmy uwierzytelniania i autoryzacji aplikacji internetowych, korzystania z plików cookie itp. Nie możesz ustawić jednej głównej dla wszystkich wątków aplikacji dla wielu użytkowników. –
Oczywiście, że nie. Może nie wyraziłem się wystarczająco jasno. – Goran