Talvez uma das coisas que mais perturbam os usuários da web seja a necessidade de decorar vários logins e senhas para os diversos sites onde eles possuam uma conta.
Para solucionar isso existem várias iniciativas de se criar “passaportes universais”, como por exemplo, o OpenId.
A Microsoft disponibiliza também uma solução para isso, o Windows Live ID Web Authentication com o qual os usuários podem se logar nos sites usando a mesma conta do Hotmail/MSN. Para os desenvolvedores é uma solução interessante pois traz agilidade na autenticação para milhões de pessoas que já possuem uma conta no MSN.
O WLIWA (abreviando) é um serviço altamente escalável pois fornece, segundo a Microsoft, mais de 22 bilhões de autenticações/mês (cada vez que uma pessoa entra no MSN ela está se autenticando pelo WLIWA). A segurança dele é auditada constantemente o que nos dá uma segurança a mais. Considerando as preocupações que temos com segurança, deixar a autenticação com um especialista já nos poupa muito trabalho.
Veja no diagrama abaixo como funciona o processo de autenticação:
Perceba pelos ítens 3 a 7 que o usuário passa seus dados de autenticação DIRETO para o Windows Live Id. Seu site não toma conhecimento dos dados de login do usuário (o que é uma segurança para o seu usuário).
Assim que a autenticação for concluída com sucesso, o WLIWA retorna para o seu site um token com o identificador único do usuário. Esse token você irá usar para autenticar o usuário em sua aplicação.
Utilizando o Microsoft Live Id em seu site
1. Preparando o ambiente
Você precisa primeiramente puxar o SDK no site http://go.microsoft.com/fwlink/?LinkID=91761
A Microsoft está disponibilizando em fase beta alguns controles para asp.net, mas neste post irei utilizar o SDK de forma “crua”.
Para cada site em que você for usar o WLIWA você precisa criar um application id em https://msm.live.com/app/default.aspx. Suas applications ids ficam amarradas ao seu Microsoft Live ID.
Na página de criação da Application Id você terá que informar os seguintes dados:
a) Application Name: um nome para sua aplicação
b) Return URL: a url que receberá o retorno com as informações de login(passo 7 do diagrama acima). Se estiver em desenvolvimento, informe algo com http://localhost/wlid/webauth-handler.aspx (por exemplo) . Note que se você debugar a aplicação direto pelo Visual Studio você terá problemas pois o Visual Studio starta o debug em portas aleatórias.
c) Domain name: para o nosso caso, deixe essa informação em branco.
d) Secret key: uma chave para identificar sua aplicação
e) Application Verifier Required: informe 0 (zero)
Após o submit, você receberá um ID para sua aplicação.
2. Criando sua aplicação
No Visual Studio crie um novo website. Na pasta app_code adicione o código fonte do sdk, que é um único arquivo .cs que por default está na pasta C:\Program Files\Windows Live ID\WebAuth\Sample\App_Code .
No web.config, adicione as seguintes entradas em appSettings:
<add key="wll_appid" value="-- SEU APPLICATION ID --"/>
<add key="wll_secret" value="-- CHAVE DA APLICACAO --"/>
<add key="wll_securityalgorithm" value="wsignin1.0"/>
Nós iremos criar duas páginas: uma que será a página inicial e a outra, a página que receberá os retornos do WLID (no nosso exemplo, webauth-handler.aspx)
Na página inicial você deve colocar um link apontando para o WLID. Esse link retornará login / logout, dependendo do estado do usuário. Ficará melhor se você colocar esse link dentro de um iFrame, como abaixo:
<iframe
id="WebAuthControl"
name="WebAuthControl"
src="http://login.live.com/controls/WebAuth.htm?appid=<%=AppId%>
&style=font-size%3A+10pt%3B+font-family%3A+verdana%3B+background%3A+white%3B"
width="80px"
height="20px"
marginwidth="0"
marginheight="0"
align="middle"
frameborder="0"
scrolling="no">
</iframe>
(para caber no layout do meu blog, quebrei o link em duas linhas. na aplicação real tome o cuidado para NÃO fazer o mesmo.)
Veja que precisamos passar o AppId. Coloquei uma tag para que esse valor seja pego do nosso Code Behind.
Em default.aspx.cs, adicione o código:
public partial class _Default : System.Web.UI.Page
{
const string LoginCookie = "webauthtoken";
static WindowsLiveLogin wll = new WindowsLiveLogin(true);
protected static string AppId = wll.AppId;
(...)
Perceba que estamos criando uma instância de WindowsLiveLogin. Essa classe está no .cs do SDK que adicionamos ao nosso diretório App_Code.
Ao instanciar essa classe, o construtor dela pega automaticamente as informações do web.config.
Como o login do usuário pode ser persistido em cookie, precisamos verificar se o usuário já está autenticado. Faremos isso no Page_Load da página default.aspx:
HttpRequest req = HttpContext.Current.Request;
HttpCookie loginCookie = req.Cookies[LoginCookie];
if(loginCookie != null){
string token = loginCookie.Value;
if (!string.IsNullOrEmpty(token))
{
WindowsLiveLogin.User user = wll.ProcessToken(token);
if (user != null)
{
Response.Write("Seu id é: " + user.Id);
}
}
}
Obviamente que na linha Response.Write você irá fazer algo mais relevante, como por exemplo, autenticar o usuário em seu sistema através do token retornado pelo WLIWA.
Precisamos agora criar a página de retorno para o WLIWA. No nosso caso, a página deverá se chamar webauth-handler.aspx. Essa página apenas terá code behind:
const string LoginPage = "default.aspx";
const string LogoutPage = LoginPage;
const string LoginCookie = "webauthtoken";
static DateTime ExpireCookie = DateTime.Now.AddYears(-10);
static DateTime PersistCookie = DateTime.Now.AddYears(10);
static WindowsLiveLogin wll = new WindowsLiveLogin(true);
protected void Page_Load(object sender, EventArgs e)
{
HttpRequest req = HttpContext.Current.Request;
HttpResponse res = HttpContext.Current.Response;
// Pega a "action" retornada pelo WLID
string action = req["action"];
/*
Se for logout, apaga o cookie e redireciona para a página de logout
Se for 'clearcookie', apaga o cookie
Por default. Trata como se fosse login. Se o login tiver sido feito com sucesso,
grava o cookie e redireciona para a página inicial
*/
if (action == "logout")
{
HttpCookie loginCookie = new HttpCookie(LoginCookie);
loginCookie.Expires = ExpireCookie;
res.Cookies.Add(loginCookie);
res.Redirect(LogoutPage);
res.End();
}
else if (action == "clearcookie")
{
HttpCookie loginCookie = new HttpCookie(LoginCookie);
loginCookie.Expires = ExpireCookie;
res.Cookies.Add(loginCookie);
string type;
byte[] content;
wll.GetClearCookieResponse(out type, out content);
res.ContentType = type;
res.OutputStream.Write(content, 0, content.Length);
res.End();
}
else
{
WindowsLiveLogin.User user = wll.ProcessLogin(req.Form);
HttpCookie loginCookie = new HttpCookie(LoginCookie);
if (user != null)
{
loginCookie.Value = user.Token;
if (user.UsePersistentCookie)
{
loginCookie.Expires = PersistCookie;
}
}
else
{
loginCookie.Expires = ExpireCookie;
}
res.Cookies.Add(loginCookie);
res.Redirect(LoginPage);
res.End();
}
}
Esse código trata três situações:login (default), logout e limpeza do cookie. Quando o login é efetuado com sucesso, um cookie é persistido no micro do usuário e ele é redirecionado para a página inicial.
3. Ligando o WLID à sua aplicação
Considerando que você terá apenas um token e não um usuário e senha, uma estratégia que você poderá usar é gravar como usuário e senha o próprio token. Veja um exemplo de código que pode ser usado no lugar do Response.Write("Seu id é: " + user.Id); do exemplo acima:
// verifica se o usuário já está cadastrado
MembershipUser userApp = Membership.GetUser(user.Id);
if (userApp == null)
{
//se não está, cria ele
Membership.CreateUser(user.Id, user.Id);
//"loga" o usuario
FormsAuthentication.SetAuthCookie(user.Id, true);
//redireciona para alguma página para completar o cadastro
Response.Redirect("cadastro.aspx");
}
else
{
// se ja existe, valida
if (Membership.ValidateUser(user.Id, user.Id))
{
//validou? "loga"
FormsAuthentication.SetAuthCookie(user.Id, true);
}
}
Você pode consultar mais informações sobre o WLID em http://msdn.microsoft.com/en-us/library/bb404787.aspx
Se tiver alguma dúvida, deixe seu comentário abaixo!