OAuth2 - Vitor-Xavier/DemoWebApi GitHub Wiki

Implementando o OAuth2

O OAuth2 é um protocolo de autorização para APIs web utilizado para gerar um token de acesso, com determinada validade, para permitir o acesso do usuário aos recursos protegidos da API.

Instalação

O OAuth2 requer os seguintes pacotes:

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

Implemetação

Para implementar o OAuth deve ser criada uma classe que herde de OAuthAuthorizationServerProvider, e sobrescreva seus métodos de validação de token e garantir a credencial informada para gerar o token, onde deve ser implementado o meio de verificar as credenciais inseridas.

ApplicationOAuthProvider.cs

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

namespace TesteOAuth.Providers
{
    /// <summary>
    /// Classe que gerencia a geração e validação de tokens.
    /// </summary>
    public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
    {
        /// <summary>
        /// Valida autenticação do cliente.
        /// </summary>
        /// <param name="c">COntexto da autenticação.</param>
        /// <returns></returns>
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext c)
        {
            c.Validated();

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

        /// <summary>
        /// Da permissões ao dono da credencial caso sua autenticação seja aprovada.
        /// </summary>
        /// <param name="c">Credenciais da requisição.</param>
        /// <returns></returns>
        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext c)
        {

            if (ValidateUser(c.UserName, c.Password))
            {
                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);
        }

        /// <summary>
        /// Verifica as crdenciais informadas.
        /// </summary>
        /// <param name="user">Nome de usuário do solicitante.</param>
        /// <param name="pass">Senha do usuário do solicitante.</param>
        /// <returns></returns>
        public bool ValidateUser(string user, string pass)
        {
            if (user.Equals("tst") && pass.Equals("tst"))
                return true;
            if (user.Equals("user1") && pass.Equals("pass1"))
                return true;
            if (user.Equals("testUser") && pass.Equals("1231234"))
                return true;
            return false;
        }

    }
}

Deve ser criada uma classe para a inicialização do Owin, portanto esta será adicionada na raiz do projeto, definindo que esta será a inicialização do Owin.

Startup.cs

using Microsoft.Owin;
using Owin;

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

Por fim a Startup.Auth.cs deve ser adicionado, comumente em App_start, porém no mesmo namespace de Startup.cs, onde é possível configurar o caminho onde ocorrerá a requisição do Token, definir o provider, que irá gerenciar a autenticação e geração de token, seu tempo de expiração e se aceitará requisições somente através de https ou se também irá aceitar http.

Startup.Auth.cs

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

namespace TesteOAuth
{
	public partial class Startup
	{
		public void ConfigureAuth(IAppBuilder app)
        {
            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.FromMinutes(30),
                AllowInsecureHttp = true
            });
        }
	}
}

Por fim, para testar o funcionamento do OAuth2 faça um requisição para o endpoint /Token com o seguinte body em formato raw, aplicando as regras de autenticação implementadas

username=[usuario]&password=[senha]&grant_type=password

Com o token obtido realize a requisição ao recurso protegido adicionando o header

Authorization: Bearer [Token obtido de /Token]

Fonte: http://www.leonardohofling.com/blog/web-api-adicionando-autenticacao-oauth/

⚠️ **GitHub.com Fallback** ⚠️