Windows Live ID Web Authentication

by Cássio R Eskelsen 20. setembro 2008 14:15

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:

untitled

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!

Tags: , , ,

.Net | asp.net

Comentários

Comentar




  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading