FoxIDs Control
FoxIDs se configura a través de FoxIDs Control, que consiste en Control Client y Control API. Control Client y la API están protegidos por FoxIDs, y Control Client usa Control API.
Control API contiene toda la funcionalidad de configuración. Por lo tanto, es posible automatizar la configuración integrando Control API.
FoxIDs Control Client
Control Client es una aplicación Blazor WebAssembly (WASM).
Abre tu Control Client en FoxIDs.com.
Tenant y entorno master
Si usas FoxIDs.com, tu tenant se crea durante el registro.
Si implementas FoxIDs (auto hospedado) obtienes acceso al tenant master. Primero crea un tenant para contener tu configuración de seguridad. La mayoría de las instalaciones solo necesitan uno, pero puedes configurar un número ilimitado de tenants.

Un tenant contiene un entorno master, desde donde se configura todo el tenant. El entorno master contiene un repositorio de usuarios y en la creación solo un usuario administrador.
Normalmente no debes cambiar la configuración del entorno master ni añadir nuevos métodos de autenticación o registros de aplicaciones, pero es posible. Puedes, por ejemplo, al añadir un método de autenticación, obtener single sign-on (SSO) para el entorno master.
Crear usuarios administradores
Es posible crear más usuarios administradores en el entorno master. Un usuario se convierte en administrador al añadir el rol de administrador foxids:tenant.admin, como se muestra a continuación.
Crear un usuario:
- Abre el entorno master
- Selecciona la pestaña Users
- Haz clic en Create User
- Añade la información del usuario y haz clic en Create.

Conceder acceso al usuario
El acceso se concede con roles. Los scopes solo se necesitan cuando un cliente solicita un token para Control API; Control Client ya solicita el scope requerido en foxids_control_api, por lo que normalmente solo asignas roles al usuario en el entorno master.
Para permitir que una persona inicie sesión en Control Client y vea los datos de configuración:
- Crea o abre el usuario en el entorno
master(pestaña Users). - Añade el rol base
foxids:tenant:basic.read(necesario para que Control Client cargue el perfil y las herramientas de ayuda). - Decide lo que el usuario puede ver:
- Para limitar la visibilidad a un entorno, añade
foxids:tenant:track[vh2csjt4].read(reemplazavh2csjt4con el nombre técnico del entorno). - Para permitir todos los entornos, añade
foxids:tenant.read.
- Para limitar la visibilidad a un entorno, añade
- Añade los roles de operación que el usuario necesite en cada entorno. Ejemplos:
foxids:tenant:track[vh2csjt4]:userpara gestionar usuarios,foxids:tenant:track[vh2csjt4]:partypara gestionar aplicaciones y métodos de autenticación.
Control Client vs solo API:
- Control Client (UI interactiva) lee datos de perfil y listas de entornos además de la API específica que deseas gestionar. Por lo tanto, necesita
foxids:tenant:basic.readmás un rol de lectura de entorno (foxids:tenant:track[main].readofoxids:tenant.read) junto con tus roles de acción. - Los consumidores solo API pueden ser más limitados. Si un servicio backend solo llama a la API de usuarios para el entorno
vh2csjt4, el rolfoxids:tenant:track[vh2csjt4]:user(y solicitar el scope correspondiente cuando se usan credenciales de cliente) es suficiente; los roles de lectura adicionales no son necesarios porque no se necesita cargar datos de UI.
Entornos
Configura varios entornos, uno por cada uno de tus entornos, por ejemplo dev, qa y prod.
Crea uno o más entornos, no coloques la configuración en el entorno master.

Cada entorno contiene un repositorio de usuarios y un método de autenticación login predeterminado.
Puedes añadir registros de aplicaciones y métodos de autenticación OpenID Connect, OAuth 2.0 y SAML 2.0.

Un entorno contiene un certificado principal y, posiblemente, un certificado secundario en la pestaña Certificates. Es posible alternar entre el certificado principal y el secundario si ambos están configurados, según el tipo de contenedor de certificado.

Las propiedades del entorno se pueden configurar haciendo clic en el icono de configuración en la parte superior derecha.
- El tiempo de vida de la secuencia es el tiempo máximo de un flujo de inicio de sesión del usuario desde el inicio hasta el final.
- FoxIDs protege contra el intento de adivinar contraseñas mediante el máximo de inicios de sesión fallidos, el tiempo de vida del conteo de fallos y el periodo de observación.
- Los requisitos de contraseña se configuran en cuanto a longitud, complejidad y riesgo de contraseña.
- Es posible alojar FoxIDs en un iframe desde dominios permitidos.
- Puedes enviar correos con tu propio tenant de SendGrid agregando una dirección de correo personalizada y una clave de SendGrid.

FoxIDs Control API
Control API es una API REST con una descripción de interfaz Swagger (OpenAPI) en línea y la Swagger UI.
Si auto hospedas FoxIDs, el documento Swagger (OpenAPI) se expone en FoxIDs Control en .../api/swagger/v2/swagger.json y la Swagger UI en .../api/swagger.
Nomenclatura de Control API:
- Un entorno se llama
track- Un registro de aplicación se llama
downparty- Un método de autenticación se llama
upparty
La URL de Control API contiene variables para el nombre del tenant y el nombre del track (nombre del entorno) con el que quieres operar: .../{tenant_name}/{track_name}/....
Reemplaza {tenant_name} con el nombre de tu tenant y {track_name} con el nombre técnico del entorno. Si generas un proxy a partir del documento Swagger (OpenAPI), esas variables se proporcionan como parámetros de entrada.
Por ejemplo, para leer un registro de aplicación OpenID Connect en FoxIDs Cloud con el nombre técnico some_oidc_app, llama (HTTP GET) https://control.foxids.com/api/{tenant_name}/{track_name}/!oidcdownparty?name=some_oidc_app (reemplaza las variables con el nombre de tu tenant y el nombre técnico del entorno).
Puedes llamar a Control API como un servicio/daemon usando un cliente OAuth 2.0 (client credentials) o en el contexto de un usuario a través de un cliente OpenID Connect.
Los pasos siguientes crean un cliente OAuth 2.0 y le otorgan derechos de acceso de nivel administrador mediante scopes y roles.
Crear un cliente OAuth 2.0 en el FoxIDs Control Client:
- Selecciona el entorno master (en el encabezado).
- Selecciona la pestaña Applications.
- Haz clic en New Application.
- Haz clic en Backend Application.
- Añade un Name por ejemplo
My API Client. - Haz clic en Register.
- Copia el Client ID y el Client secret.
- Haz clic en Close.
- Añade un Name por ejemplo
- Haz clic en tu registro de cliente en la lista para abrirlo.
- En la sección Resource and scopes - concede al cliente acceso a tu tenant:
- Haz clic en Add Resource and scope y añade el recurso
foxids_control_api. - Haz clic en Add Scope y añade el scope
foxids:tenant.
- Haz clic en Add Resource and scope y añade el recurso
- Selecciona Show advanced.
- En la sección Issue claims - concede al cliente el rol de administrador del tenant:
- Haz clic en Add Claim y añade el claim
role. - Haz clic en Add Value y añade el valor del claim
foxids:tenant.admin.
- Haz clic en Add Claim y añade el claim
- Haz clic en Update.
Luego realiza una solicitud OAuth 2.0 Client Credentials Grant para obtener un token de acceso para Control API.
Reemplaza {tenant_name}, {track_name}, {client_id} y {client_secret}. Cambia el dominio si estás auto hospedando.
Ejemplo de Postman
Esta colección de Postman autentica con el cliente OAuth 2.0 My API Client y devuelve los usuarios para el entorno (track) configurado.
Crea un archivo JSON de colección de Postman, por ejemplo foxids_control_api.postman_collection.json, con el contenido siguiente. Reemplaza {tenant_name}, {track_name}, {client_id} y {client_secret}. Cambia los dominios (foxids.com y control.foxids.com) si estás auto hospedando.
{
"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"
]
}
}
}
]
}
Ejemplo de solicitud HTTP
Este ejemplo HTTP se autentica como el cliente OAuth 2.0 My API Client con el grant de client credentials.
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
Respuesta JSON del 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
}
El access_token se utiliza para llamar a Control API.
Ejemplo de código C#
Este ejemplo de C# se autentica como el cliente OAuth 2.0 My API Client con el grant de client credentials.
// 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);
Luego llama a Control API con el token de acceso en el encabezado Authorization Bearer, tal como se define en el estándar OAuth 2.0 Bearer Token (RFC 6750).
Ejemplo de código C#
Este ejemplo de C# muestra cómo agregar el token de acceso al HttpClient y leer el registro de aplicación OpenID Connect some_oidc_app (nombre 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");
Derechos de acceso a la API
Esto muestra la configuración de Control API en el entorno master de un tenant con el conjunto predeterminado de scopes que conceden acceso a los datos del tenant.

Puedes agregar más scopes para ampliar los derechos de acceso a Control API por entorno y lograr configuraciones de mínimo privilegio.
El acceso a Control API está limitado por scopes y roles. Hay dos familias de scopes: foxids:master concede acceso a los datos del tenant master y foxids:tenant concede acceso a los datos del tenant.
El recurso de Control API foxids_control_api se define en el entorno master de cada tenant, y los scopes configurados conceden acceso a los datos de ese tenant a través de Control API.
El acceso de un scope puede limitarse agregando más elementos separados por puntos y punto y coma. La notación de puntos limita a un sub-rol específico y se usa tanto en scopes como en roles. Los consumidores deben presentar uno o más scope(s) y rol(es) coincidentes.
Cada derecho de acceso se define tanto como scope como rol. Esto te permite conceder o limitar el acceso tanto a nivel de cliente como de usuario. Los derechos de acceso son jerárquicos, y el cliente y el usuario no necesitan scopes y roles coincidentes.
El rol administrador foxids:tenant.admin concede acceso a todos los datos de un tenant y a los datos del tenant master; equivale a tener los roles foxids:tenant y foxids:master.
Un cliente solicita un scope especificando el recurso y el scope separados por un punto y coma. Por ejemplo, para solicitar el scope foxids:tenant:track:party.create, el cliente solicita foxids_control_api:foxids:tenant:track:party.create.
Si una solicitud es denegada por derechos de acceso insuficientes, se registra un elemento de trazas con los posibles scopes y roles autorizantes junto con los scopes y roles reales del usuario.
Derechos de acceso del tenant
Los derechos de acceso del tenant son tanto scopes como roles.
Si el scope que necesitas no está definido en Control API
foxids_control_api, puedes agregar el scope.
El :track[xxxx] especifica un entorno por el nombre técnico. Por ejemplo, un entorno Test con el nombre técnico hsgm7je5 es :track[hsgm7je5]
y un entorno Production con el nombre técnico - es :track[-].
| Scope / role | Access |
|---|---|
| Acceso a todo en el tenant, no a los datos del tenant master. | |
foxids:tenant |
read, create, update, delete |
foxids:tenant.read |
read |
foxids:tenant.create |
create |
foxids:tenant.update |
update |
foxids:tenant.delete |
delete |
| Acceso a elementos básicos del 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 |
| Acceso a todo en todos los entornos de un tenant, sin incluir el entorno 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 |
| Acceso a todo en un entorno específico de un tenant. `xxxx` es el nombre técnico del entorno. | |
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 los registros de uso en todos los entornos de un tenant, sin incluir el entorno master. No aplicable en el tenant master. | |
foxids:tenant:track:usage |
read |
| Registros de uso en un entorno específico de un tenant. No aplicable en el tenant master. | |
foxids:tenant:track[xxxx]:usage |
read |
| Todos los registros de auditoría en todos los entornos de un tenant, sin incluir el entorno master. | |
foxids:tenant:track:audit |
read |
| Registros de auditoría en un entorno específico de un tenant. | |
foxids:tenant:track[xxxx]:audit |
read |
| Todos los registros en todos los entornos de un tenant, sin incluir el entorno 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 |
| Registros en un entorno específico de un tenant. | |
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 los usuarios en todos los entornos de un tenant, sin incluir el entorno 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 los usuarios en un entorno específico de un 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 |
| Todos los registros de aplicaciones y métodos de autenticación en todos los entornos de un tenant, sin incluir el entorno 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 los registros de aplicaciones y métodos de autenticación en un entorno específico de un 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 |
Derechos de acceso del tenant master
Los derechos de acceso del tenant master son tanto scopes como roles.
| Scope / role | Access |
|---|---|
| Acceso a los datos del tenant master Puede listar, crear y eliminar tenants pero no consultar otros tenants. |
|
foxids:master |
read, create, update, delete |
foxids:master.read |
read |
foxids:master.create |
create |
foxids:master.update |
update |
foxids:master.delete |
delete |
| Registro de auditoría en el tenant master. | |
foxids:master:audit |
read |
| Registro de uso en el tenant master. | |
foxids:master:usage |
read |