Servidor de autorização compartilhado OAuth para vários aplicativos

8

Na minha loja, temos algumas APIs da Web .NET que usam tokens OAuth para autenticação. Atualmente, cada API da web é um servidor de autorização e de recursos. Os usuários se autenticam em todas essas APIs usando a mesma credencial, mas atualmente precisam se autenticar em cada API independentemente.

Estou interessado em criar um servidor de autorização compartilhado (em http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ), mas estou ficando preso na transformação de reivindicações. É altamente útil poder adicionar declarações personalizadas (específicas do aplicativo) ao token emitido, de acordo com o exemplo a seguir:

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{

    /* validate credentials here... */

    var identity = new ClaimsIdentity("JWT");

    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
    identity.AddClaim(new Claim("sub", context.UserName));
    identity.AddClaim(new Claim(ClaimTypes.Role, "Manager"));
    identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor"));

    var props = new AuthenticationProperties(new Dictionary<string, string>
        {
            {
                 "audience", (context.ClientId == null) ? string.Empty : context.ClientId
            }
        });

    var ticket = new AuthenticationTicket(identity, props);
    context.Validated(ticket);
    return Task.FromResult<object>(null);
}

Pelo que pude ver, se eu criar um servidor de Autorização comum, todas as transformações de declarações precisarão acontecer lá. Isso significa que os servidores de recursos (nossas diferentes APIs da Web) não podem adicionar reivindicações personalizadas ao token do usuário? Posso adicionar reivindicações específicas ao aplicativo que está solicitando o token no servidor de Autorização - ou preciso montar algo para que o servidor de autorização adicione determinadas declarações com base no aplicativo solicitante?

Joshua Barron
fonte
Para futuros espectadores desta pergunta, nunca encontrei uma solução para o recurso consumidor adicionar declarações personalizadas. Acabei escrevendo um servidor de autorização que aceitaria uma configuração comum para cada servidor de recursos e gerasse declarações personalizadas com base nisso.
Joshua Barron
Parece que você precisaria ter suas reivindicações gerenciadas em um banco de dados central e preenchido quando o token foi emitido. O OAuth por si só é realmente apenas autenticação / emissão de token. A autorização ainda é uma peça que você precisa conectar (reivindicações, funções etc.) e gerenciar separadamente.
Kasey Speakman

Respostas:

1

No passado, eu tinha um servidor de autenticação que emitia tokens. Em seguida, o cliente enviou o token de autenticação para um servidor de autorização com uma solicitação do formulário:

"O cliente com este application_id está solicitando acesso ao usuário definido no token de autenticação anexado para acessar o conteúdo X."

O servidor de autorização verificou se o usuário foi autorizado e emitiu um novo token de autorização para o cliente. O cliente passou esse token para o serviço que forneceu o conteúdo X.

O servidor de autorização nesse caso precisava de uma atualização de configuração para saber sobre o novo conteúdo Y.

Você pode modificá-lo para que os servidores de recursos solicitem ao servidor de autorização que crie um token contendo declarações personalizadas anexadas.

Chad Clark
fonte