Usando MembershipProvider personalizado sem um controle de login no ASP.NET
-
09-06-2019 - |
Pergunta
Temos um costume MembershipProvider
em ASP.NET
.Agora existem 2 cenários possíveis em que o usuário pode ser validado:
Login do usuário através
login.aspx
página digitando seu nome de usuário/senha.Eu tenho usado Controle de login e relacionou-o com oMyMembershipProvider
.Isso está funcionando perfeitamente bem.Um token de autenticação é passado por meio de algum URL na string de consulta de diferentes sites.Para isso eu tenho uma sobrecarga em
MembershipProvider.Validate(string authenticationToken)
, que na verdade está validando o usuário.Neste caso não podemos usar o Controle de login.Agora, como posso usar o mesmoMembershipProvider
para validar o usuário sem realmente usar o Controle de login?eu tentei ligarValidate
manualmente, mas isso não significa fazer login do usuário.
Aqui está o trecho de código que estou usando
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
}
}
Solução
Depois que a validação for bem-sucedida, você precisará fazer login do usuário, chamando FormsAuthentication.Authenticate: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.authenticate.aspx
EDITAR:É FormsAuthentication.SetAuthCookie:http://msdn.microsoft.com/en-us/library/twk5762b.aspx
Além disso, para redirecionar o usuário de volta para onde ele queria ir, chame:FormsAuthentication.RedirectFromLoginPage: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.redirectfromloginpage.aspx
Outras dicas
Você pode definir o seu próprio FormsAuthenticationTicket
se a validação for bem-sucedida.
Algo assim;
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
}
}
Você está certo no caso de armazenar as informações de autenticação diretamente como um cookie.Mas usando uma função hash forte (por exemploMD5 + SHA1) é excelente e seguro.A propósito, se você usar sessões (que também é apenas um cookie hash), poderá anexar informações de autenticação a ele.