OAuth2 - Authorization Code Grant no startup.cs

  • Rafael Miceli
  • 16 Jun 2016

No post anterior implementamos de forma crua o Authorization Code Grant.

Mas a forma que fizemos isso foi que ao acessar a Index da nossa aplicação (apenas nesse momento), seria feito o redirecionamento para o nosso Authorization Server.

Vamos fazer como uma aplicação padrão. Apenas quando acessar uma área não autorizada somos redirecionados.

Implementando Authorization Code Grant no startup.cs

Vamos no passo a passo

Passo 1

Vamos configurar nosso OpenIdConnectAuthenticationOptions para realizar nosso flow em nosso startup.cs

Para isso vamos deixar nosso startup.cs da seguinte forma:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "cookies"
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            ClientId = "teste_code",
            Authority = "http://localhost:54734",
            RedirectUri = "http://localhost:60758/",
            ResponseType = "code",
            Scope = "openid profile",
            PostLogoutRedirectUri = "http://localhost:60758/",
            SignInAsAuthenticationType = "cookies",


            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = async notification =>
                {
                    var requestResponse = await OidcClient.CallTokenEndpointAsync(
                        new Uri("http://localhost:54734/connect/token"),
                        new Uri("http://localhost:60758/"),
                        notification.Code,
                        "teste_code",
                        "secret");

                    var identity = notification.AuthenticationTicket.Identity;

                    identity.AddClaim(new Claim("id_token", requestResponse.IdentityToken));
                    identity.AddClaim(new Claim("access_token", requestResponse.AccessToken));

                    notification.AuthenticationTicket = new AuthenticationTicket(identity, notification.AuthenticationTicket.Properties);
                },

                RedirectToIdentityProvider = notification =>
                {
                    if (notification.ProtocolMessage.RequestType != OpenIdConnectRequestType.LogoutRequest)
                    {
                        return Task.FromResult(0);
                    }

                    notification.ProtocolMessage.IdTokenHint =
                        notification.OwinContext.Authentication.User.FindFirst("id_token").Value;

                    return Task.FromResult(0);
                }
            }
        });

        
    }
}

Explicando o codigo:

A primeira etapa de configurar ClientId, Authority até a propriedade SignInAsAuthenticationType já expliquei em um post anterior.

Nesta parte o principal é nosso Notifications, que vai instanciar OpenIdConnectAuthenticationNotifications e vamos popular sua propriedade AuthorizationCodeReceived.

Em AuthorizationCodeReceived nós estamos fazendo o equivalente a nosso Callback do post anterior.

No post anterior ao chamar o endpoint Authorize passamos um endereço de Callback. Dessa vez não precisamos do Callback que criamos anteriormente, uma vez que nosso AuthorizationCodeReceived faz isso por nós.

Nele chamamos nosso endpoint Token (assim como no anterior), e passamos o code que recebemos em nosso parâmetro notification.

Após, guardamos nosso Identity em uma variável identity e adicionamos os Claims id_token e access_token.

Por fim setamos nosso novo AuthenticationTicket como nosso identity.

Passo 2

Removemos o Redirect para nosso endpoint Authorize do nosso Authorization Server da nossa action Index e excluimos o método de Callback.

Pronto!

Temos nosso Authorization Code Grant configurado.

Mas… Se você for perspicaz vai perceber que ai possui um erro. No post seguinte tem a correção.

comentarios com Disqus Disqus