2009-05-26 20 views
28

Sto cercando di far funzionare il provider di appartenenze.Membership ASP.NET: come impostare l'utente come registrato

Finora ho:

<asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate"> 
</asp:Login> 

chiamando:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if(Membership.ValidateUser(Login1.UserName, Login1.Password)) 
    { 
     Response.Redirect("/admin/default.aspx"); 
     // Set the user as logged in? 
    } 
} 

Se entro il corretto login/password, la funzione ValidateUser restituisce true. Quindi la mia domanda è: come faccio a impostare l'utente come registrato?

sto testando questo nelle mie pagine fare:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Membership.GetUser()==null) 
    { 
     Response.Redirect("/admin/login.aspx"); 
    } 
    // else "you are logged in, congratulations"     
} 

avrei usato le funzioni predefinite, ma non è solo di lavoro e una ricerca su google mi ha fatto pensare che io risparmiare tempo in realtà ricodificazione tutto ciò me stesso.

Qualsiasi cosa aiuterà!

MODIFICA: Per quanto riguarda la risposta accettata, è quella corretta per "come impostare l'utente come connesso" e funziona correttamente. Non ha risolto il mio problema specifico ma solo una parte di esso. Pensato se guardi i commenti penserai che troverai suggerimenti interessanti.

EDIT 2 e soluzione: Ok finalmente l'ho risolto grazie a tutti i commenti. Ecco quello che ho fatto, è più semplice di quello che mi aspettavo:

pagina che controlla login Stato:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     Response.Redirect("/admin/login.aspx"); 
    } 

Log out:

protected void LoginStatus1_Logout(object sender, LoginCancelEventArgs e) 
    { 
     FormsAuthentication.SignOut(); 
     Response.Redirect("/admin/login.aspx"); 
    } 
} 

web.config:

<authentication mode="Forms" /> 

login:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if(Membership.ValidateUser(Login1.UserName, Login1.Password)) 
    { 
     FormsAuthentication.SetAuthCookie(Login1.UserName, true); 
     Response.Redirect("/admin/default.aspx"); 

    } 
} 

risposta

36

Mettere questo in Login1_Authenticate prima di chiamare Response.Redirect("/admin/default.aspx");

FormsAuthentication.SetAuthCookie("username", true); 
+0

e ancora ottenere Catturato da se (Membership.GetUser() == nu ll). Dovrei provare ad ottenere lo stato di login in qualche altro modo? – marcgg

+0

IMO, dovresti trattare solo questi elementi di accesso nella pagina Login.aspx. Il SetAuthCookie funziona, l'ho già usato prima. Se non funziona per te, c'è qualcosa nel tuo codice che sta rovinando tutto :( – Gromer

+0

Tutto il mio codice è lassù Quello che sto cercando di fare altrove che nella pagina di accesso è "se non connesso quindi reindirizzare alla pagina di login ". – marcgg

2

Gromer ha la risposta, ma si può anche dare un'occhiata a questo articolo di MSDN per ulteriori informazioni:

http://msdn.microsoft.com/en-us/library/ms998347.aspx

+0

Come ho già detto, sembra corretto ma non funziona poiché non riesco a ottenere il fatto che l'utente abbia eseguito correttamente l'accesso. Deve essere ovvio, ma sono nuovo a .net – marcgg

6

provare a spostare la vostra codice e suggerimento di Gromer per l'evento LoggedIn.

protected void Login1_LoggedIn(object sender, EventArgs e) 
    { 
     if(Membership.ValidateUser(Login1.UserName, Login1.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(Login1.UserName, true); 
      Response.Redirect("/admin/default.aspx"); 
     } 

    } 

EDIT: Come Gromer detto, solo fare questo se si deve eseguire del codice affari dopo che l'utente è connesso e prima s/he viene reindirizzato.

MODIFICA MODIFICA: Visual Studio descrive l'evento Autentica come "chiamato per autenticare l'utente", che implica che l'utente non è autenticato prima che l'evento venga chiamato. Pertanto, non è possibile confermare che l'utente abbia effettuato l'accesso perché non è stato ancora autenticato.

+0

qual è esattamente l'evento loggedIn? – marcgg

+0

È un evento chiamato dal controllo di accesso dopo che un utente è stato autenticato. Vedi http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.loggedin.aspx –

+0

grazie. – marcgg

1

Anche se non so quanto questo sia d'aiuto, questo è il codice standard che uso per distinguere tra utenti amministratori o utenti regolari. Funziona alla grande per me.

Nella pagina di login, probabilmente onclick creare l'oggetto utente e chiamare una funzione con questo codice (UserRole è un Enum con i ruoli):

If admin Then 
      If role = UserRole.Admin Then 
       RedirectFromLoginPage(username & "|" & userid, False) 
       Return True 
      Else 
       Return False 
      End If 
     Else 
      If String.IsNullOrEmpty(Current.Request.QueryString("ReturnUrl")) Then 
       SetAuthCookie(username & "|" & userid, True) 
      Else 
       RedirectFromLoginPage(username & "|" & userid, True) 
      End If 
      Return True 
     End If 

Nel web.config:

<location path="admin"> 
    <system.web> 
     <authorization> 
      <allow roles="Admin"/> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
</location> 
..... 
<system.web> 
<authentication mode="Forms"> 
     <forms loginUrl="/registration/login.aspx" timeout="129600"/> 
    </authentication> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
</system.web> 

... e se si vuole veramente, nella tua pagina Global.asax:

Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) 
    If Request.IsAuthenticated Then 
'' 
'get your roles for the current user' 
'' 
Dim userRoles() As String = Split(roles, "|") 
     'Add the roles to the User Principal' 
     HttpContext.Current.User = New GenericPrincipal(User.Identity, userRoles) 
    End If 
End Sub 
Problemi correlati