Web Api – Adicionando autenticação (OAuth)

Boas galera!

Quando você cria um projeto WEB API com autenticação, ele adiciona um monte de features que podem não ser úteis para todos os tipos de projetos, então vamos fazer passo a passo e ativar somente o necessário.

1) Crie um projeto ASP .NET WEB API sem autenticação.

2) Adicione os pacotes necessários via Nuget:

install-package Microsoft.Aspnet.Identity.Owin
install-package Microsoft.Owin.Security.Cookies
install-package Microsoft.Owin.Security.OAuth
install-package Microsoft.Owin.Host.SystemWeb
install-package Microsoft.Owin.Hosting
install-package Microsoft.Owin.Cors
install-package Owin.Security.Providers

3) Criar a classe de startup do Owin (Startup.cs) na raiz do projeto. Vamos criar ela como Partial class para terminar a codificação posteriormente em outro local.

using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(WebApplication1.Startup))]
namespace WebApplication1
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

4) Dentro da pasta App_Start, crie a classe Startup novamente, mas chame o arquivo de Startup.Auth.cs (não é obrigatório ter esse nome).

using Owin;

namespace WebApplication1
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            //TODO: Configurar Owin mais tarde
        }
    }
}

5) Crie uma pasta chamada Providers na raiz do projeto.
6) Dentro da pasta Providers crie uma classe chamada “ApplicationOAuthProvider”, será o nosso Custom Provider para o OAuth

using Microsoft.Owin.Security.OAuth;
using System.Security.Claims;
using System.Threading.Tasks;

namespace WebApplication1.Providers
{
    public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
    {
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext c)
        {
            c.Validated();

            return Task.FromResult<object>(null);
        }

        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext c)
        {
            // Aqui você deve implementar sua regra de autenticação
            if (c.UserName == "leonardo" && c.Password == "123123")
            {
                Claim claim1 = new Claim(ClaimTypes.Name, c.UserName);
                Claim[] claims = new Claim[] { claim1 };
                ClaimsIdentity claimsIdentity =
                    new ClaimsIdentity(
                       claims, OAuthDefaults.AuthenticationType);
                c.Validated(claimsIdentity);
            }

            return Task.FromResult<object>(null);
        }
    }
}

7) Agora que já temos o nosso provider, vamos voltar ao arquivo Statup.Auth.cs e configurar para aceitar autenticação via OAuth utilizando nosso provider.

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using WebApplication1.Providers;

namespace WebApplication1
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            // Para utilizar o Header "Authorization" nas requisições
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            // Ativar o método para gerar o OAuth Token
            app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions()
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                AllowInsecureHttp = true
            });
        }
    }
}

8) Adicione ao seu web.config dentro do nó “”:

<authentication mode="None" />

9) Dentro da pasta Controllers, crie um novo “Web API 2 Controller – Empty”, chame ele de “MeController”

Screenshot_14

using Microsoft.Owin.Security;
using System.Web;
using System.Web.Http;

namespace WebApplication1.Controllers
{
    public class MeController : ApiController
    {
        // Retorna Nosso Authentication Manager
        private IAuthenticationManager Authentication
        {
            get { return HttpContext.Current.GetOwinContext().Authentication; }
        }

        // GET api/me
        // A tag Authorize obriga estar autenticado para acessar o mesmo
        [Authorize]
        public string Get()
        {
            return this.Authentication.User.Identity.Name;
        }
    }
}

10) Agora vamos executar e ver o funcionamento. Execute o projeto e mude o endereço para “http://localhost:xxxx/api/me”, você verá uma mensagem informando que a autorização foi negada:

Screenshot_15

 

11) Para autorizar vamos enviar uma solicitação para o /Token, para isso vou utilizar o aplicativo “Postman”, disponível para instalar no chrome:

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop

12) Crie uma requisição post para “http://localhost:xxxx/Token”

Adicione o Header:

Content-Type: application/x-www-form-urlencoded

Adicione body(raw):

username=leonardo&password=123123&grant_type=password

13) Agora com um Token em mãos, conseguiremos acessar o “http://localhost:xxx/api/me”. Crie uma requisição para este endereço, do tipo GET e adicione o Header:

Authorization: Bearer TokenObtidoAnteriormente

Pronto, nossa autenticação já está funcionando via OAuth.
Espero ter ajudado, qualquer dúvida estou a disposição!

Código fonte:
https://github.com/leonardohof/WebApiTest

Fontes:
http://aspnetguru.com/adding-authentication-to-asp-net-web-api/


Curta também minha página no Facebook para ficar por dentro das novidades:
https://www.facebook.com/devleonardohofling

20 Responses

  1. Danilo Setin disse:

    Obrigado Leonardo, seu post me ajudou muito!

    Abraço

  2. Diego Junqueira disse:

    Ótimo post, porém tenho uma duvida, preciso gerar um token para um usuário, porém após isso outro usuário precisará gerar outro token, quando isso ocorre o token do primeiro usuário fica inválido, existe alguma alternativa ou sempre será assim, ou seja, consigo ter mais de um token ativo?

    • Leonardo Hofling disse:

      Obrigado. Cara, o token não era pra ficar inválido não, eu utilizo desta forma em vários projetos e nunca tive problemas…

  3. JOAO CARLOS Moura (JMOURA) disse:

    Olá Leonardo, obrigado pelo post.
    Tem como adicionar mais informações no retorno além do token?
    Por exemplo retorno tambem o nome do cliente?

  4. Cristiano Pereira disse:

    Obrigado Leonardo. Foi muito útil pra mim. vlw mesmo.

  5. Vinícius Maia disse:

    Cara eu tive um erro aqui. Implementei as classes Startup e Startup.Auth, mas o projeto não compila. O erro que ele dispara é “The name ‘ConfigureAuth” does not exist in the current context. Sabe o que pode ser? já dei até ctrl c + ctrl v nas classes do seu projeto e não funciona.

    • Leonardo Hofling disse:

      Olá, tudo bem? Você chegou a reparar que eu criei a classe Startup duas vezes? Ambas com o mesmo namespace em pastas diferentes. Ela é uma classe Partial, ou seja, ela permite que a classe seja definida em vários arquivos. O código fonte do projeto está em https://github.com/leonardohof/WebApiTest caso queira baixar e dar uma olhada mais de perto no código.

      • Vinícius Maia disse:

        Obrigado por me responder. O erro estava no namespace. Eu nunca tinha usado classes parciais e não havia notado que era necessário utilizar mesmo namespace para que elas funcionassem.

  6. Michel Lucio da Silva disse:

    Estou com um problema par entender com funciona o roteamento, no meu projeto atual eu usava no StartUp usando [“Route”] no controller para direcionar o link… mas nao entendi no seu projeto … desde ja agradeco

  7. Everton Miranda de Oliveira disse:

    Show Leonardo! Me ajudou bastante… Obrigado por compartilhar!

  8. Ruy Nunes disse:

    Leonardo, bom dia.

    Como faço para customizar os niveis de acesso utilizando o OAuth, tem como dar uma ajuda ?

  9. Neto Silva disse:

    Obrigado, funcionou perfeitamente e me ajudou demais.

  1. 18 de agosto de 2015

    […] com o assunto do post anterior “Adicionando autenticação (OAuth)“, fiz este artigo explicando como adicionar o Facebook como Login provider em nossa Web […]

  2. 11 de maio de 2016

    […] com a configuração da autenticação OAuth (http://www.leonardohofling.com/blog/web-api-adicionando-autenticacao-oauth/), vamos ver um jeito de adicionar algumas informações adicionais junto ao […]

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *