2013-07-14 21 views
19

Potrzebuję pobrać UserId Guid bezpośrednio po pomyślnym zalogowaniu. Poniższy kod nie działa:User.Identity.IsAuthenticated ma wartość false po pomyślnym zalogowaniu

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     // doesn't run 
     Guid puk = (Guid)Membership.GetUser().ProviderUserKey;    
    } 
} 

Poniższy kod działa:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    MembershipUser user = Membership.GetUser(txtUsername.Value); 

    if (user != null) 
    { 
     Guid puk = (Guid)user.ProviderUserKey; 
    } 
} 

Dlaczego tak się dzieje? Czy jest coś więcej oprócz SetAuthCookie?

Odpowiedz

13

Ponieważ po wywołaniu FormsAuthentication.SetAuthCookie(txtUsername.Value, true); przechowujesz klucz w plikach cookie klienta. W tym celu należy wykonać odpowiedź dla użytkownika. I do HttpContext.Current.User.Identity do wypełnienia ciastkiem potrzebujesz jeszcze jednego wniosku.

W krótkim schemacie wygląda następująco:

  1. Klient wysyła swoją nazwę użytkownika i hasło.

  2. Serwer otrzymuje i sprawdza. Jeśli są prawidłowe, serwer wysyła do klienta nagłówek Set-Cookie.

  3. Klient otrzymuje i przechowuje. Dla każdego żądania klient wysyła pliki cookie z powrotem na serwer.

UPDATE dla @Jake

Dodawanie przykład ustawienie User w HttpContext

var identity = new System.Security.Principal.GenericIdentity(user.UserName); 
var principal = new GenericPrincipal(identity, new string[0]); 
HttpContext.Current.User = principal; 
Thread.CurrentPrincipal = principal; 

Zauważ, że można utworzyć niestandardową klasę główną dziedziczy od GenericPrincipal lub ClaimsPrincipal

+0

Czy istnieje jakiś sposób, aby uzyskać dostęp do tożsamości użytkownika w taki sam wniosek? –

+1

@AhmadAhmadi można ustawić ręcznie przypisując obiekt CustomPrincipal do właściwości użytkownika HttpContext. –

+0

@OleksiiAza Czy możesz zaktualizować odpowiedź, aby pokazać, jak to zrobić? – Jake

22

miałem ten sam problem. Zapomniałem ustawić konfigurację web.config.

Może również tęskniłeś.

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/user/login" timeout="1000" name="__Auth" /> 
    </authentication> 
    </system.web> 
0

Próbowałem wszystkie powyższe rozwiązania, ale rzeczą, która rozwiązuje mój problem został komentowania tego w web.config

<modules> 
    <remove name="FormsAuthentication"/> 
</modules> 
0

W moim przypadku środowiska rozwój, nieruchomości requiressl została ustawiona na wartość true, ja naprawiono problem, zmieniając go na requireSSL = false.

enter image description here