FoxIDs Control
O FoxIDs é configurado através do FoxIDs Control, que consiste no Control Client e no Control API. O Control Client e o Control API são protegidos pelo FoxIDs, e o Control Client utiliza o Control API.
Control API contém todas as funcionalidades de configuração. Por conseguinte, é possível automatizar a configuração através da integração com o Control API.
FoxIDs Control Client
O Control Client é uma aplicação Blazor WebAssembly (WASM).
Abra o seu Control Client em FoxIDs.com.
Tenant e ambiente master
Se usar FoxIDs.com, o seu tenant é criado durante o registo.
Se implementar o FoxIDs em self-hosting, obtém acesso ao tenant master. Crie primeiro um tenant para conter a sua configuração de segurança. A maioria das instalações só precisa de um, mas pode configurar um número ilimitado de tenants.

Um tenant contém um ambiente master, a partir do qual todo o tenant é configurado. O ambiente master contém um repositório de utilizadores e, na criação, apenas um utilizador administrador.
Normalmente não deve alterar a configuração do ambiente master nem adicionar novos métodos de autenticação ou registos de aplicações, mas isso é possível. Pode, por exemplo, ao adicionar um método de autenticação, obter single sign-on (SSO) para o ambiente master.
Criar utilizadores administradores
É possível criar mais utilizadores administradores no ambiente master. Um utilizador torna-se administrador ao adicionar o papel de administrador foxids:tenant.admin, como mostrado abaixo.
Crie um utilizador:
- Abra o ambiente master
- Selecione o separador Users
- Clique em Create User
- Adicione a informação do utilizador e clique em Create.

Conceder acesso ao utilizador
O acesso é concedido com papéis. Os scopes só são necessários quando um cliente pede um token para a Control API; o Control Client já pede o scope necessário em foxids_control_api, por isso normalmente apenas atribui papéis ao utilizador no ambiente master.
Para permitir que uma pessoa inicie sessão no Control Client e veja dados de configuração:
- Crie ou abra o utilizador no ambiente
master(separador Users). - Adicione o papel base
foxids:tenant:basic.read(necessário para o Control Client carregar o perfil e ferramentas auxiliares). - Decida o que o utilizador pode ver:
- Para limitar a visibilidade a um ambiente, adicione
foxids:tenant:track[vh2csjt4].read(substituavh2csjt4pelo nome técnico do ambiente). - Para permitir todos os ambientes, adicione
foxids:tenant.read.
- Para limitar a visibilidade a um ambiente, adicione
- Adicione os papéis operacionais de que o utilizador necessita em cada ambiente. Exemplos:
foxids:tenant:track[vh2csjt4]:userpara gerir utilizadores,foxids:tenant:track[vh2csjt4]:partypara gerir aplicações e métodos de autenticação.
Control Client vs apenas API:
- O Control Client (UI interativa) lê dados de perfil e listas de ambientes, além da API específica que pretende gerir. Por isso precisa de
foxids:tenant:basic.readmais um papel de leitura de ambiente (foxids:tenant:track[main].readoufoxids:tenant.read) juntamente com os seus papéis de ação. - Chamadores apenas API podem ser mais restritos. Se um serviço backend apenas chamar a user API para o ambiente
vh2csjt4, o papelfoxids:tenant:track[vh2csjt4]:useré suficiente, juntamente com o pedido do scope correspondente quando usar client credentials. Os papéis extra de leitura não são necessários porque não há dados de UI para carregar.
Ambientes
Um ambiente é um Identity Provider independente com o seu próprio repositório de utilizadores, certificado, métodos de autenticação, registos de aplicações e definições. Utilize ambientes separados para isolar fases como desenvolvimento, teste e produção.
Consulte Ambientes para obter informações sobre a separação, o conteúdo, a criação e a configuração de ambientes.
FoxIDs Control API
A Control API é uma REST API com descrição online da interface Swagger (OpenAPI) e Swagger UI.
Se alojar o FoxIDs em self-hosting, o documento Swagger (OpenAPI) fica exposto no FoxIDs Control em .../api/swagger/v2/swagger.json e a Swagger UI em .../api/swagger.
Nomenclatura da Control API:
- Um ambiente chama-se
track- Um registo de aplicação chama-se
downparty- Um método de autenticação chama-se
upparty
O URL da Control API contém variáveis para o nome do tenant e do track, isto é, o nome do ambiente onde pretende operar: .../{tenant_name}/{track_name}/....
Substitua {tenant_name} pelo nome do tenant e {track_name} pelo nome técnico do ambiente. Se gerar um proxy a partir do documento Swagger (OpenAPI), essas variáveis são fornecidas como parâmetros de entrada.
Por exemplo, para ler um registo de aplicação OpenID Connect no FoxIDs Cloud com o nome técnico some_oidc_app, faça a chamada HTTP GET https://control.foxids.com/api/{tenant_name}/{track_name}/!oidcdownparty?name=some_oidc_app, substituindo as variáveis pelo nome do seu tenant e o nome técnico do ambiente.
Pode chamar a Control API como serviço/daemon usando um cliente OAuth 2.0 com client credentials ou no contexto de um utilizador através de um cliente OpenID Connect.
Os passos abaixo criam um cliente OAuth 2.0 e concedem-lhe direitos de acesso de nível administrativo através de scopes e papéis.
Crie um cliente OAuth 2.0 no FoxIDs Control Client:
- Selecione o ambiente master no cabeçalho.
- Selecione o separador Applications.
- Clique em New Application.
- Clique em Backend Application.
- Adicione um Name, por exemplo
My API Client. - Clique em Register.
- Copie o Client ID e o Client secret.
- Clique em Close.
- Adicione um Name, por exemplo
- Clique no registo do cliente na lista para o abrir.
- Na secção Resource and scopes, que concede ao cliente acesso ao seu tenant:
- Clique em Add Resource and scope e adicione o recurso
foxids_control_api. - Clique em Add Scope e adicione o scope
foxids:tenant.
- Clique em Add Resource and scope e adicione o recurso
- Selecione Show advanced.
- Na secção Issue claims, que concede ao cliente o papel de administrador do tenant:
- Clique em Add Claim e adicione o claim
role. - Clique em Add Value e adicione o valor de claim
foxids:tenant.admin.
- Clique em Add Claim e adicione o claim
- Clique em Update.
Depois execute um pedido OAuth 2.0 Client Credentials Grant para obter um access token para a Control API.
Substitua {tenant_name}, {track_name}, {client_id} e {client_secret}. Altere o domínio se estiver em self-hosting.
Exemplo Postman
Esta coleção Postman autentica com o cliente OAuth 2.0 My API Client e devolve os utilizadores do ambiente configurado, isto é, o track.
Crie um ficheiro JSON de coleção Postman, por exemplo foxids_control_api.postman_collection.json, com o conteúdo abaixo. Substitua {tenant_name}, {track_name}, {client_id} e {client_secret}. Altere os domínios (foxids.com e control.foxids.com) se estiver em self-hosting.
{
"info": {
"name": "FoxIDs API",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
},
"item": [
{
"name": "GET users",
"request": {
"auth": {
"type": "oauth2",
"oauth2": [
{
"key": "accessTokenUrl",
"value": "https://foxids.com/{tenant_name}/master/{client_id}/(*)/oauth/token",
"type": "string"
},
{
"key": "clientSecret",
"value": "{client_secret}",
"type": "string"
},
{
"key": "clientId",
"value": "{client_id}",
"type": "string"
},
{
"key": "tokenName",
"value": "api_access_token",
"type": "string"
},
{
"key": "client_authentication",
"value": "body",
"type": "string"
},
{
"key": "scope",
"value": "foxids_control_api:foxids:tenant",
"type": "string"
},
{
"key": "grant_type",
"value": "client_credentials",
"type": "string"
},
{
"key": "addTokenTo",
"value": "header",
"type": "string"
}
]
},
"method": "GET",
"header": [],
url: {
"protocol": "https",
"host": [
"control.foxids.com"
],
"port": "443",
"path": [
api,
"{tenant_name}",
"{track_name}",
"!users"
]
}
}
}
]
}
Exemplo de pedido HTTP
Este exemplo HTTP autentica como o cliente OAuth 2.0 My API Client com o client credentials grant.
POST https://foxids.com/{tenant_name}/{track_name}/{client_id}(*)/oauth/token HTTP/1.1
"Host": "foxids.com"
Content-Type: application/x-www-form-urlencoded
client_id={client_id}
&client_secret={client_secret}
&grant_type=client_credentials
&scope=foxids_control_api%3Afoxids%3Atenant
Resposta JSON do token:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhGfjlc...nNjH3iIWvMdCM",
"token_type":"Bearer",
"expires_in":3600
}
O access_token é usado para chamar a Control API.
Exemplo de código C#
Este exemplo C# autentica como o cliente OAuth 2.0 My API Client com o client credentials grant.
// NuGet package: ITfoxtec.Identity
using ITfoxtec.Identity.Helpers
var oidcDiscoveryUrl = "https://foxids.com/{tenant_name}/{track_name}/{client_id}(*)/.well-known/openid-configuration";
// Inject IHttpClientFactory httpClientFactory
var oidcDiscovery = new OidcDiscoveryHandler(httpClientFactory, oidcDiscoveryUrl);
// Inject IHttpClientFactory httpClientFactory
var tokenHelper = new TokenHelper(httpClientFactory, oidcDiscovery);
var clientId = "{client_id}";
var clientSecret = "{client_secret}";
var scope = "foxids_control_api:foxids:tenant";
(var accessToken, var expiresIn) = await tokenHelper.GetAccessTokenWithClientCredentialGrantAsync(clientId, clientSecret, scope);
Depois chame a Control API com o access token num header Authorization Bearer, conforme definido pelo standard OAuth 2.0 Bearer Token (RFC 6750).
Exemplo de código C#
Este exemplo C# mostra como adicionar o access token ao HttpClient e ler o registo de aplicação OpenID Connect some_oidc_app, isto é, o nome técnico.
// NuGet package: ITfoxtec.Identity
using ITfoxtec.Identity
// Inject IHttpClientFactory httpClientFactory
var httpClient = httpClientFactory.CreateClient();
// Add the access token
httpClient.SetAuthorizationHeaderBearer(accessToken);
// Call Control API using the httpClient
// E.g. read a OpenID Connect application registration
using var response = await client.GetAsync("https://control.foxids.com/api/{tenant_name}/{track_name}/!oidcdownparty?name=some_oidc_app");
Direitos de acesso à API
Isto mostra a configuração da Control API no ambiente master de um tenant com o conjunto predefinido de scopes que concede acesso aos dados do tenant.

Pode adicionar mais scopes para alargar os direitos de acesso à Control API por ambiente e obter configurações least-privilege.
O acesso à Control API é limitado por scopes e papéis. Existem duas famílias de scopes: foxids:master concede acesso a dados do master tenant e foxids:tenant concede acesso a dados do tenant.
O recurso da Control API foxids_control_api é definido no ambiente master de cada tenant, e os scopes configurados concedem acesso aos dados desse tenant através da Control API.
O acesso de um scope pode ser restringido adicionando mais elementos separados por dois pontos e pontos. A notação com ponto limita a um sub-papel específico e é usada tanto em scopes como em papéis. Os chamadores têm de apresentar um ou mais scopes e papéis correspondentes.
Cada direito de acesso é definido tanto como scope como como papel. Isto permite conceder ou limitar acesso tanto ao nível do cliente como ao nível do utilizador. Os direitos de acesso são hierárquicos e o cliente e o utilizador não precisam de ter scopes e papéis correspondentes.
O papel de administrador foxids:tenant.admin concede acesso a todos os dados de um tenant e aos dados do master tenant; equivale a ter os papéis foxids:tenant e foxids:master.
Um cliente pede um scope ao especificar o recurso e o scope separados por dois pontos. Por exemplo, para pedir o scope foxids:tenant:track:party.create, o cliente pede foxids_control_api:foxids:tenant:track:party.create.
Se um pedido for negado devido a direitos de acesso insuficientes, é registado um trace item com os possíveis scopes e papéis autorizadores juntamente com os scopes e papéis reais do utilizador.
Direitos de acesso do tenant
Os direitos de acesso do tenant são tanto scopes como papéis.
Se o scope de que precisa não estiver definido na Control API
foxids_control_api, pode adicioná-lo.
:track[xxxx] especifica um ambiente pelo nome técnico. Por exemplo, um ambiente Test com o nome técnico hsgm7je5 é :track[hsgm7je5]
e um ambiente Production com o nome técnico - é :track[-].
| Scope / role | Access |
|---|---|
| Acesso a tudo no tenant, excluindo dados do master tenant. | |
foxids:tenant |
read, create, update, delete |
foxids:tenant.read |
read |
foxids:tenant.create |
create |
foxids:tenant.update |
update |
foxids:tenant.delete |
delete |
| Acesso a elementos base do tenant:
|
|
foxids:tenant:basic |
read, create, update, delete |
foxids:tenant:basic.read |
read |
foxids:tenant:basic.create |
create |
foxids:tenant:basic.update |
update |
foxids:tenant:basic.delete |
delete |
| Acesso a tudo em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track |
read, create, update, delete |
foxids:tenant:track.read |
read |
foxids:tenant:track.create |
create |
foxids:tenant:track.update |
update |
foxids:tenant:track.delete |
delete |
| Acesso a tudo num ambiente específico de um tenant. `xxxx` é o nome técnico do ambiente. | |
foxids:tenant:track[xxxx] |
read, create, update, delete |
foxids:tenant:track[xxxx].read |
read |
foxids:tenant:track[xxxx].create |
create |
foxids:tenant:track[xxxx].update |
update |
foxids:tenant:track[xxxx].delete |
delete |
| Todos os logs de utilização em todos os ambientes de um tenant, excluindo o ambiente master. Não se aplica no master tenant. | |
foxids:tenant:track:usage |
read |
| Logs de utilização num ambiente específico de um tenant. Não se aplica no master tenant. | |
foxids:tenant:track[xxxx]:usage |
read |
| Todos os audit logs em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track:audit |
read |
| Audit logs num ambiente específico de um tenant. | |
foxids:tenant:track[xxxx]:audit |
read |
| Todos os logs em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track:log |
read, create, update, delete |
foxids:tenant:track:log.read |
read |
foxids:tenant:track:log.create |
create |
foxids:tenant:track:log.update |
update |
foxids:tenant:track:log.delete |
delete |
| Logs num tenant específico. | |
foxids:tenant:track[xxxx]:log |
read, create, update, delete |
foxids:tenant:track[xxxx]:log.read |
read |
foxids:tenant:track[xxxx]:log.create |
create |
foxids:tenant:track[xxxx]:log.update |
update |
foxids:tenant:track[xxxx]:log.delete |
delete |
| Todos os utilizadores e memberships de estruturas de acesso em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track:user |
read, create, update, delete |
foxids:tenant:track:user.read |
read |
foxids:tenant:track:user.create |
create |
foxids:tenant:track:user.update |
update |
foxids:tenant:track:user.delete |
delete |
| Todos os utilizadores e memberships de estruturas de acesso num ambiente específico de um tenant. | |
foxids:tenant:track[xxxx]:user |
read, create, update, delete |
foxids:tenant:track[xxxx]:user.read |
read |
foxids:tenant:track[xxxx]:user.create |
create |
foxids:tenant:track[xxxx]:user.update |
update |
foxids:tenant:track[xxxx]:user.delete |
delete |
| Todas as estruturas de acesso e memberships de estruturas de acesso em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track:accessstructure |
read, create, update, delete |
foxids:tenant:track:accessstructure.read |
read |
foxids:tenant:track:accessstructure.create |
create |
foxids:tenant:track:accessstructure.update |
update |
foxids:tenant:track:accessstructure.delete |
delete |
| Todas as estruturas de acesso e memberships de estruturas de acesso num ambiente específico de um tenant. | |
foxids:tenant:track[xxxx]:accessstructure |
read, create, update, delete |
foxids:tenant:track[xxxx]:accessstructure.read |
read |
foxids:tenant:track[xxxx]:accessstructure.create |
create |
foxids:tenant:track[xxxx]:accessstructure.update |
update |
foxids:tenant:track[xxxx]:accessstructure.delete |
delete |
| Todos os registos de aplicações e métodos de autenticação em todos os ambientes de um tenant, excluindo o ambiente master. | |
foxids:tenant:track:party |
read, create, update, delete |
foxids:tenant:track:party.read |
read |
foxids:tenant:track:party.create |
create |
foxids:tenant:track:party.update |
update |
foxids:tenant:track:party.delete |
delete |
| Todos os registos de aplicações e métodos de autenticação num ambiente específico de um tenant. | |
foxids:tenant:track[xxxx]:party |
read, create, update, delete |
foxids:tenant:track[xxxx]:party.read |
read |
foxids:tenant:track[xxxx]:party.create |
create |
foxids:tenant:track[xxxx]:party.update |
update |
foxids:tenant:track[xxxx]:party.delete |
delete |
Direitos de acesso do master tenant
Os direitos de acesso do master tenant são tanto scopes como papéis.
| Scope / role | Access |
|---|---|
| Acesso aos dados do master tenant Pode listar, criar e eliminar tenants, mas não pode consultar outros tenants. |
|
foxids:master |
read, create, update, delete |
foxids:master.read |
read |
foxids:master.create |
create |
foxids:master.update |
update |
foxids:master.delete |
delete |
| Audit log no master tenant. | |
foxids:master:audit |
read |
| Log de utilização no master tenant. | |
foxids:master:usage |
read |