FoxIDs Control
O FoxIDs é configurado através do FoxIDs Control, que consiste em Control Client e Control API. O Control Client e a API são protegidos pelo FoxIDs, e o Control Client usa a Control API.
A Control API contém toda a funcionalidade de configuração. Por isso, é possível automatizar a configuração através de integração com a 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
Configure um conjunto de ambientes, um para cada um dos seus ambientes, por exemplo dev, qa e prod.
Crie um ou mais ambientes, não coloque configuração no ambiente master.

Cada ambiente contém um repositório de utilizadores e um método de autenticação login por predefinição.
Pode adicionar registos de aplicações e métodos de autenticação OpenID Connect, OAuth 2.0 e SAML 2.0.

Um ambiente contém um certificado primário e possivelmente um certificado secundário no separador Certificates. É possível trocar entre o certificado primário e o secundário se ambos estiverem configurados, dependendo do tipo de contentor do certificado.

As propriedades do ambiente podem ser configuradas clicando no ícone de definições no canto superior direito.
- Sequence lifetime é o tempo máximo de vida do fluxo de login de um utilizador do início ao fim.
- O FoxIDs protege contra tentativas de adivinhar passwords através de max failing logins, tempo de vida da contagem de falhas de login e observation period.
- Os requisitos de password são configurados em relação a comprimento, complexidade e password risk.
- É possível alojar o FoxIDs num iframe a partir de domínios permitidos.
- Pode enviar emails com o seu próprio tenant SendGrid ao adicionar um endereço de email personalizado e a chave SendGrid.

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 |