Ciao. Dovrei implementare un cambio password obbligatorio su un sito web creato con le Membership API e masterpage.
Io ho provato ad inserire la logica del controllo del cambio password nel metodo LoggedIn del componente Login, controllando la data di creazione dell'account e la data di primo cambio password (se sono uguali devo fare il cambio password).
Suggerimenti?
dovrebbe funzionare, ma non va?

hai fatto così?


al logginIn nelle membership prelevo LastPasswordChangedDate dell'user

con un timespan ricavo la differenza con la data attuale

se maggiore dei numeri di giorni previsti rimando al cambio password
Modificato da teo prome il 16 marzo 2011 10.45 -
Per funzionare funziona, ma la scocciatura è che devo mettere in ogni pagina un controllo con una sessione che verifica se ho cambiato o meno la password al primo login. Il tutto perchè utilizzo il metodo "LoggedIn".
Questo perchè ho notato che fin che non mi loggo, non posso utilizzare le Membership per controllare se lo username è presente o meno sul db, prima ancora della verifica delle date. Infatti con "LogginIn" non riesco a far nulla.
non ho capito...

devi far cambiare obbligatoriamente la password agli utenti se scaduta?

allora è corretto farlo al logging e farlo come ti ho detto è il modo corretto, nel db delle membership di default hai LastPasswordChangedDate che è il dato che ti serve

perchè devi mettere il controllo in ogni pagina?
se hai implementato membership e ruoli avrai una pagina con il controllo di login o uno tuo custom, le pagine accessibili solo dopo aver effettuato il login saranno protette a web.config e se l'utente tenta l'accesso verrà rimandato alla pagina iniziale (ma questo se hai configurato tutto correttamente)

inoltre

Questo perchè ho notato che fin che non mi loggo, non posso utilizzare le Membership per controllare se lo username è presente o meno sul db


questo non è corretto, hai il metodo

Membership.FindUsersByName

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

ma dalla tua ultima frase non comprendo più cosa vuoi fare veramente
teo prome ha scritto:
non ho capito...

devi far cambiare obbligatoriamente la password agli utenti se scaduta?


Anche, ma inizialmente devo controllare se è il suo primo login e controllo questo con la data di creazione e quella dell'ultimo cambio password. Se le date sono uguali, allora è al primo login.


allora è corretto farlo al logging e farlo come ti ho detto è il modo corretto, nel db delle membership di default hai LastPasswordChangedDate che è il dato che ti serve


Infatti faccio questo e nel caso sono nella condizione di cambio, eseguo un Server.Tranfer alla pagina di cambio password.
Qui avevo fatto un errore: questa pagina era dentro l'area riservata, ecco perchè comunque avrei dovuto loggarmi...


perchè devi mettere il controllo in ogni pagina?
se hai implementato membership e ruoli avrai una pagina con il controllo di login o uno tuo custom, le pagine accessibili solo dopo aver effettuato il login saranno protette a web.config e se l'utente tenta l'accesso verrà rimandato alla pagina iniziale (ma questo se hai configurato tutto correttamente)

Perchè avevo sbagliato la logica... Prima la pagina di cambio password era nell'area riservata, quindi dovevo per forza loggarmi. Adesso è nella root del sito.
Inoltre ho spostato tutta la logica di controllo (primo login, password expired, ecc..) nell'evento LogginIn (e non in LoggedIn) della lagina di login.


inoltre

Questo perchè ho notato che fin che non mi loggo, non posso utilizzare le Membership per controllare se lo username è presente o meno sul db


questo non è corretto, hai il metodo

Membership.FindUsersByName

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

ma dalla tua ultima frase non comprendo più cosa vuoi fare veramente


Ecco, avevo dimenticato che non utilizzavo Membership.FindUsersByName nel LogginIn ma semplicemente Membership.GetUser(nomeutente).

Adesso ho un altro problemino: con il Server.Transfer vado alla pagina di cambio password (che utilizza il controllo asp:ChangePassword ,a ma ho un errore nel cambio. Credo che sia perchè il controllo asp:ChangePassword non sappia su quale utente eseguire il cambio....
Devo impostare la proprietà UserName del controllo asp:ChangePassword ?
si l'errore è per quel motivo

ma perchè, visto che teoricamente l'utente si è loggato, tu hai fatto le tue verifiche per il cambio pwd, direzioni (con Server.Transfert...) e teoricamente dovresti avere a disposizione un User.Identity?

il motivo è proprio dovuto all'uso del Server.Transfert; il caso che hai in mano è uno di quelli in cui non va proprio usato

in breve:
l'utente si logga, viene generato il ticket e memorizzato nel response cookie collection
Server.Transfert non passa dal lato client, quindi il ticket non può essere memorizzato, quindi non potrai avere a disposizione User.Identity

Infatti se nel controllo ChangePassword metti visibile il nome utente (DisplayUserName="True|False") vedrai visualizzato un bel null

Usa Response.Redirect!
teo prome ha scritto:
si l'errore è per quel motivo

ma perchè, visto che teoricamente l'utente si è loggato, tu hai fatto le tue verifiche per il cambio pwd, direzioni (con Server.Transfert...) e teoricamente dovresti avere a disposizione un User.Identity?


Ma se l'utente è nel LoggingIn non è ancora loggato ma ci sta provando!


il motivo è proprio dovuto all'uso del Server.Transfert; il caso che hai in mano è uno di quelli in cui non va proprio usato

in breve:
l'utente si logga, viene generato il ticket e memorizzato nel response cookie collection
Server.Transfert non passa dal lato client, quindi il ticket non può essere memorizzato, quindi non potrai avere a disposizione User.Identity

Infatti se nel controllo ChangePassword metti visibile il nome utente (DisplayUserName="True|False") vedrai visualizzato un bel null


Vero, lo username è null (come infatti ti avevo descritto).


Usa Response.Redirect!


Fatto ma non fa il redirect!!

Ecco lo stralcio di codice che ho scritto:
protected void LoginUser_LoggingIn(object sender, LoginCancelEventArgs e) {
            if (!Page.IsValid)
                return;

            MembershipUserCollection users = Membership.FindUsersByName(HttpUtility.HtmlEncode(LoginUser.UserName));
            MembershipUser user = users[HttpUtility.HtmlEncode(LoginUser.UserName)];

            if (user == null)
                return;

            this.CheckFirstLogin(user);
            this.CheckAccountExpired(user);

            //controllo cambio password obbligatorio dopo 6 mesi dalla creazione
            this.ChangePassword(user);           
        }


private void CheckFirstLogin(MembershipUser user) {
            
            if (user.CreationDate.Ticks == user.LastPasswordChangedDate.Ticks) {
                log.InfoFormat("Primo accesso per {0}. Cambio password obbligatorio per account {0}.", user.UserName);
                
                //Server.Transfer("~/ChangePassword.aspx", true);
                Response.Redirect("../ChangePassword.aspx", false);
            }
        }


Quando esegue il ResponseRedirect, non redireziona nulla e prosegue tranquillamente nell'esecuzione del codice... Non so piu' davvero cosa fare...
Modificato da andri745 il 20 marzo 2011 11.05 -
Modificato da andri745 il 20 marzo 2011 11.09 -
Sei sicuro che il codice all'interno del IF in CheckFirstLogin() venga eseguito? Mi sembra estremamente strano che un Response.Redirect() non svolga il suo lavoro....
Prova poi ad utilizzare un

Response.Redirect("../ChangePassword.aspx");

invece di

Response.Redirect("../ChangePassword.aspx", false);

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC