OAuth2 - Vitor-Xavier/DemoWebApi GitHub Wiki
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.
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
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/