Utilizzando il Custom MembershipProvider senza un controllo di Accesso in ASP.NET
-
09-06-2019 - |
Domanda
Abbiamo avuto una custom MembershipProvider
in ASP.NET
.Ora ci sono 2 possibili scenari per l'utente possono essere convalidati:
Login utente via
login.aspx
pagina inserendo il suo nome utente/password.Ho usato Controllo di accesso e collegato con ilMyMembershipProvider
.Questo funziona alla perfezione.Un token di autenticazione viene passato tramite un URL nella stringa di query forma a diversi siti web.Per questo ho un sovraccarico in
MembershipProvider.Validate(string authenticationToken)
, che è in realtà la convalida dell'utente.In questo caso non possiamo usare il Controllo di accesso.Ora, come posso usare lo stessoMembershipProvider
per convalidare l'utente senza utilizzare il Controllo di accesso?Ho provato a chiamareValidate
manualmente, ma questa non è la firma dell'utente.
Ecco il frammento di codice che sto utilizzando
if (!string.IsNullOrEmpty(Request.QueryString["authenticationToken"])) {
string ticket = Request.QueryString["authenticationToken"];
MyMembershipProvider provider = Membership.Provider as MyMembershipProvider;
if (provider != null) {
if (provider.ValidateUser(ticket))
// Login Success
else
// Login Fail
}
}
Soluzione
Dopo la convalida ha esito positivo, è necessario per accedere l'utente, chiamando FormsAuthentication.Autenticazione: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.authenticate.aspx
EDIT:È FormsAuthentication.SetAuthCookie:http://msdn.microsoft.com/en-us/library/twk5762b.aspx
Inoltre, per reindirizzare l'utente dove voleva andare, chiamata:FormsAuthentication.RedirectFromLoginPage: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.redirectfromloginpage.aspx
Altri suggerimenti
Si può impostare il proprio FormsAuthenticationTicket
se la convalida è successo.
Qualcosa di simile;
if (provider != null) {
if (provider.ValidateUser(ticket)) {
// Login Success
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, //version
someUserName, //name
DateTime.Now, //issue date
DateTime.Now.AddMinutes(lengthOfSession), //expiration
false, // persistence of login
FormsAuthentication.FormsCookiePath
);
//encrypt the ticket
string hash = FormsAuthentication.Encrypt(authTicket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
Response.Cookies.Add(cookie);
Response.Redirect(url where you want the user to land);
} else {
// Login Fail
}
}
Hai ragione nel caso di memorizzazione di auth informazioni come un cookie direttamente.Ma con una forte funzione di hash (ad es.MD5 + SHA1) è grande e sicuro.A proposito, se si utilizzano le sessioni (che è anche solo un hash dei cookie, è possibile collegare auth informazioni.