Ir para o conteúdo principal

Sauron

O Sauron é uma ferramenta que permite o gerenciamento de autorização e autenticação de sistemas e usuários.

Para realizar tais funcionalidades, o Sauron implementa dois recursos essenciais, são eles:

É um middleware em .NET que utiliza Oauth2 e o OpenID Connect, e tem como finalidade permitir que diferentes aplicações conversem entre sí.

É uma API que dá suporte à funcionalidade de logon da interface do usuário. Gerencia usuários, senhas, dados de perfil, funções,  declarações, tokens, confirmação por email e muito mais. 

Configurando um Client

O Sauron permite a utilização de clients criados em diferentes tecnologias. Para a aplicação conseguir autorizar um acesso com sucesso, ele deve estar devidamente cadastrada no Sauron.

Acesse o Guia de Instalação de um Client para saber como cadastrar um aplicativo no Sauron.

Todo aplicativo no Sauron, idependente da tecnologia, possuis as mesmas características dentro do srvidor de autoridade, essas informações são importantes na hora de você configurar seu aplicativo, são elas:

Todo aplicativo cadastrado no Sauron é definido com o Grant Type 'authorization_code' e também com 'client_credentials'. 

O Sauron não faz controle de recursos por scopes, porém todo aplicativo é configurado com com os scopes 'openid', 'profile', 'offline_access'. O OpenID Connect requer um escopo com o nome de 'openid'

Demonstrando em um aplicativo .Net Core 2.x

Para adicionar suporte à autenticação do OpenID Connect ao aplicativo MVC, adicione o seguinte [ConfigureServices] em [Startup]:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc", options =>
        {
                options.SignInScheme = "cookie";
                options.Authority = "https://auth-sauron.dev.local";
                options.ResponseType = "code";
                options.RequireHttpsMetadata = false;
                options.ClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
                options.SaveTokens = true;
                options.Scope.Add("openid");
                options.Scope.Add("profile");
        });
}

Explicando o código

  • [AddAuthentication] adiciona os serviços de autenticação ao DI. Estamos usando um cookie para entrar localmente no usuário (via ["Cookies"] como o [DefaultScheme]), e configuramos o [DefaultChallengeSchemepara] ["oidc"] porque quando precisarmos que o usuário faça o login, usaremos o protocolo OpenID Connect.

  • Em seguida, usamos [AddCookie] para adicionar o manipulador que pode processar cookies, essa etapa pode ser personalizada para definir caminhos de tratamentos e tempo de expiração de cookie, mas cuidado, pois para realizar o LogOut total do usuário, o oidc precisa ser destruido.

  • Finalmente, [AddOpenIdConnect] é usado para configurar o manipulador que executa o protocolo OpenID Connect.

O [Authority] indica que estamos confiando na aplicação SAURON

Em seguida, identificamos esse cliente por meio do [ClientId]

[SaveTokens] é usado para persistir os tokens do IdentityServer no cookie

[ResponseType] deve ser informado o Grant Type definido para o aplicativo,
Para ele poder realizar o fluxo de autenticação correta.

[Scope] deve ser informado os scopes com qual o aplicativo irá trabalhar.

Além disso, desativamos o mapeamento do tipo de declaração JWT para permitir que as declarações bem conhecidas (por exemplo, 'sub' e 'idp') fluam por meio de mensagens não importadas:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

E, em seguida, para assegurar os serviços de autenticação executar em cada pedido, adicione [UseAuthentication] a [Configure] em [Startup]:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseAuthentication();

    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}