2012-04-17 13 views
9

Po sprawdzeniu poświadczeń użytkownika i potwierdzeniu, że są one dobre, używam FormsAuthentication.SetAuthCookie("Username", false); do uwierzytelnienia użytkownika.Czy FormsAuthentication.SetAuthCookie() wymaga przekierowania?

Na stronie głównej używam następnie Page.User.Identity.IsAuthenticated, aby upewnić się, że mamy do czynienia z zalogowanym użytkownikiem, a nie gościem.

Problem polega na pierwszym ustawieniu pliku cookie auth. Kiedy ustawiam ciasteczko uwierzytelniające, natychmiast potem uruchamiam metodę, która używa Page.User.Identity.IsAuthenticated, aby zmienić wiadomość powitalną od ogólnej "Witamy, gość!" wiadomość do bardziej osobistego "Witamy, nazwa użytkownika!" wiadomość. To nie działa, dopóki nie przejdę na inną stronę, więc wiem, że proces logowania zadziałał, ale wygląda na to, że nie mam dostępu do potrzebnych informacji, dopóki nie nastąpi odświeżenie lub przekierowanie.

Czy muszę przekierować użytkownika po ustawieniu pliku cookie autoryzacji, aby zmienić numer wiadomości, używając Page.User.Identity.IsAuthenticated?

Odpowiedz

6

Widziałem to wcześniej, więc wiem, że odpowiedź brzmi "tak". (Jak w tak trzeba zrobić, aby przekierować użytkownika do prawidłowego korzystania Page.User.Identity.IsAuthenticated)

Co ja sobie wyobrazić jest przyczyną dlatego IsAuthenticated ocenia aktualny wniosek, a gdy obecny wniosek pierwszy przyszedł w nim został nagrany jako nie uwierzytelniony.

To, co musisz zrobić, to zastosować dowolną logikę, którą posiadasz we wspomnianej metodzie, bez sprawdzenia pod kątem IsAuthenicated (załóżmy, że to prawda).

Teraz nie znam szczegółów twojej metody, aby zasugerować, jak to zmienić, aby poradzić sobie z tym, ale możesz podzielić część "Do Stuff" na oddzielną funkcję, którą możesz wtedy wywołać bezpośrednio z funkcji logowania, aby ominąć sprawdzanie autentyczności.


EDIT: Aby utworzyć kopię zapasową moje przypuszczenie co można read this page.

Interesującą część:

dostaw biletów formy uwierzytelniania form uwierzytelniania informacji do kolejnego wniosku złożonego przez przeglądarkę.

+0

Ach, to rzeczywiście wydaje się być w przypadku wtedy, dzięki za odpowiedź! Myślę, że mógłbym po prostu przekierować użytkownika po jego autoryzacji, a wtedy nie musiałbym zawracać sobie głowy pisaniem obejścia, by wypełnić wiadomość powitalną za pierwszym razem. –

+0

@SgtBeardy: Tak, przekierowanie brzmi jak wystarczająco dobre rozwiązanie dla mnie – musefan

3

Chciałbym zwrócić uwagę, że w rzeczywistości istnieje sposób obejścia tego problemu (ponieważ nigdy nie widziałem tego w innym podobnym pytaniu). Możesz pobrać plik cookie i jego dane, skąd pochodzą dane User.Identity bez przekierowania. Chodzi o to, że ciasteczko nie zostało jeszcze wysłane do przeglądarki.

To po prostu dostaje ciasteczko wykonane przez FormsAuthentication z Response.Cookies obiektu:

HttpCookie EncryptedCookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName); 
FormsAuthenticationTicket DecryptedCookie; 
try { 
    DecryptedCookie = FormsAuthentication.Decrypt(EncryptedCookie.Value); 
} catch (ArgumentException) { 
    // Not a valid cookie 
    return false; 
} 
// DecryptedCookie.Name: The Username 
// DecryptedCookie.UserData: Any additional data, as a string. This isn't normally used 
return !DecryptedCookie.Expired; 
+0

Dzięki @Pluto uratowałeś dzień !!! To była twoja uwaga: "ciasteczko nie zostało jeszcze wysłane do przeglądarki", które dostarczyło przełomu. –

Powiązane problemy