Guía paso a paso para implementar AccessPoint en su entorno de Microsoft 365 y Azure

Last updated: August 09, 2026 by Steve

Guía de implementación

AccessPoint utiliza un modelo de implementación dividido: un elemento web SPFx ligero en SharePoint, una aplicación de Teams que aloja el mismo elemento web como una pestaña personal y un backend de Azure que ejecuta la API y almacena todos los datos. Cada componente se instala en su propio inquilino de Microsoft 365 y suscripción de Azure: nada está alojado por el publicador y ningún dato de cliente sale de su entorno.

Descripción general

Componente Obténgalo de Se instala en
Elemento web SPFx (accesspoint.sppkg) Microsoft AppSource o carga directa a su catálogo de aplicaciones Su inquilino de SharePoint Online
Aplicación de Teams (accesspoint-teams.zip) Microsoft AppSource o carga al Centro de administración de Teams Su catálogo de aplicaciones de Teams
Backend de Azure (App Service, SQL, Blob Storage, Application Insights) Plantilla Bicep/ARM con un solo clic desde el portal de Azure (recomendado) o Bicep con scripts + PowerShell Su suscripción de Azure

Para nubes soberanas o gubernamentales, fijación de versiones o implementaciones con scripts, todos los artefactos también se publican en https://get.realizer.io/public/accesspoint/latest/.

El orden de instalación importa. Instale la solución de SharePoint antes de que cualquier usuario abra la pestaña personal de Teams. La aplicación de Teams carga el elemento web SPFx desde SharePoint en un iframe: sin ella, los usuarios verán un error 404 de SharePoint dentro de Teams.

Requisitos previos

  • Una suscripción activa de AccessPoint (obtenga AccessPoint) — la API activa su licencia automáticamente mediante su identidad de Entra, por lo que no se necesita ninguna clave de licencia salvo que el Soporte de Realizer proporcione una para su inquilino
  • Una suscripción de Azure con derechos de Colaborador (o superiores) sobre el grupo de recursos de destino
  • Un catálogo de aplicaciones de SharePoint aprovisionado en su inquilino, además de derechos de Administrador de SharePoint
  • Administrador global o Administrador de aplicaciones en Entra ID para las concesiones de permisos de Graph y el consentimiento del administrador
  • Administrador de Teams (o Administrador global) para publicar la aplicación de Teams
  • Para implementaciones con scripts o manuales: Azure CLI (con sesión iniciada mediante az login como usuario, no como entidad de servicio) y el módulo PnP.PowerShell

No existe ninguna dependencia de nivel de licencia de Microsoft 365, Power Platform ni Dataverse: cualquier usuario con acceso a SharePoint o Teams puede usar AccessPoint.

Paso 1: Implementar los recursos de Azure

Este paso aprovisiona el backend: un App Service de Linux (la API), Azure SQL Database, Blob Storage y Application Insights con Log Analytics. Los recursos se nombran {type}-accesspoint-{tenantName} (por ejemplo, app-accesspoint-contoso) y están reforzados de forma predeterminada (TLS 1.3, autenticación SQL solo con Entra, FTPS y autenticación básica deshabilitados, Microsoft Defender for SQL activado de forma predeterminada). El servidor SQL se crea con prioridad Entra: el usuario que realiza la implementación se convierte en el administrador inicial de Entra y nunca existe ninguna credencial de SQL — no hay nada que rotar ni deshabilitar.

¿Le llegan correos semanales de «Vulnerability Assessment scan completed» con comprobaciones fallidas, pero no ve nada en el portal? Es lo esperado en una implementación reciente, no una vulnerabilidad. Microsoft Defender for SQL ejecuta la evaluación de vulnerabilidades clásica (respaldada por almacenamiento), pero el panel de Defender del portal de Azure ahora muestra de forma predeterminada la vista express configuration, más reciente, por lo que el vínculo «Ver resultados» del correo puede llevar a una vista sin análisis. Las comprobaciones fallidas son comprobaciones de línea base, que fallan hasta que el estado actual se aprueba como línea base — la plantilla preaprueba la comprobación determinista VA2065 (reglas de firewall), pero una comprobación de seguimiento de usuarios de baja gravedad y específica del inquilino, sobre la base de datos de la aplicación, no se puede declarar de antemano. Resuélvalo una sola vez: abra el servidor SQL (no la base de datos) → Microsoft Defender for Cloud → Evaluación de vulnerabilidades → abra la comprobación fallida → Aprobar como línea baseAnalizar de nuevo; los correos semanales posteriores indicarán que todas las comprobaciones se superan.

Opción A: Portal de Azure (recomendado). Implemente la plantilla Bicep/ARM de AccessPoint con un solo clic desde el portal de Azure (el botón Implementar en Azure). El formulario de implementación recopila su suscripción y grupo de recursos, el nombre del inquilino (p. ej., contoso de contoso.sharepoint.com), y un Tipo de implementación obligatorio y sin valor predeterminado: elija Nueva instalación para una implementación por primera vez, o Actualizar instalación existente al volver a implementar sobre una instancia de AccessPoint en ejecución — la postura de actualización conserva la configuración de aplicación añadida por el operador y no toca el acceso a la base de datos. De forma opcional, elija una SKU de App Service (B1 para evaluación, S1 para producción estándar, P1v3 predeterminada), un correo electrónico de alerta y las capacidades de IA opcionales que se describen más abajo. Deje en blanco la clave de API de licencia — AccessPoint activa su licencia automáticamente mediante la identidad de Entra de la aplicación; introduzca un valor solo si el Soporte de Realizer proporciona uno para su inquilino. El paquete de la API se implementa automáticamente en el App Service: tras la implementación, no existe ninguna dependencia en tiempo de ejecución de servicios externos.

Finalizar la instalación (permisos de Graph). La plantilla en sí nunca concede permisos de Graph. Después de la implementación, abra el enlace finishSetupUrl de las salidas (Outputs) de la implementación e inicie sesión como Administrador global: la página Finalizar instalación del publicador concede, en un único pase idempotente, todos los permisos de Graph que necesita la identidad administrada. Vuelva a visitar el mismo enlace después de una actualización para incorporar los permisos introducidos recientemente. A continuación, realice un ciclo completo de Detención/Inicio en el App Service (no Reiniciar) para que los permisos surtan efecto.

Implementación de la plantilla Bicep/ARM de AccessPoint en el portal de Azure

Opción B: Bicep + PowerShell. Para canalizaciones personalizadas o un control de cambios estricto, ejecute el script de implementación contra la plantilla ARM publicada:

Invoke-WebRequest -Uri "https://get.realizer.io/public/accesspoint/latest/Deploy-AccessPoint.ps1" -OutFile "Deploy-AccessPoint.ps1"

# End-to-end: infrastructure, configuration, and both apps
.\Deploy-AccessPoint.ps1 `
    -SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
    -TemplateUri "https://get.realizer.io/public/accesspoint/latest/main.json" `
    -DeploySharePointApp -DeployTeamsApp

El script detecta automáticamente el tipo de implementación (nueva instalación o actualización) y ejecuta hasta siete pasos: infraestructura, autenticación SQL solo con Entra (una salvaguarda: las plantillas actuales crean el servidor con prioridad Entra), concesiones de permisos de Graph (el equivalente con script de la página Finalizar instalación), un ciclo de detención/inicio del App Service, la entidad de almacenamiento opcional de SharePoint (URL de la API), aprobaciones de permisos de la API de SPFx e instalaciones opcionales de aplicaciones. Cada uno se puede omitir de forma independiente (-SkipInfrastructure, -SkipGraphPermissions, -SkipSharePoint). Fije una versión con -ArtifactBaseUrl "https://get.realizer.io/public/accesspoint/2.0.67" para obtener implementaciones reproducibles y con integridad verificada (el script comprueba el SHA-256 publicado y se cancela si no coinciden).

Para ejecutar usted mismo las partes de la infraestructura en su lugar:

$TenantName    = "contoso"
$ResourceGroup = "rg-accesspoint-$TenantName"

az group create --name $ResourceGroup --location "canadacentral"

$deployment = az deployment group create `
    --resource-group $ResourceGroup `
    --template-uri "https://get.realizer.io/public/accesspoint/latest/main.json" `
    --parameters tenantName=$TenantName appServiceSku=P1v3 `
    --output json | ConvertFrom-Json

$appName     = $deployment.properties.outputs.appServiceName.value
$apiUrl      = $deployment.properties.outputs.appServiceUrl.value
$principalId = $deployment.properties.outputs.appServicePrincipalId.value

# Backstop only: current templates create the SQL server Entra-first, so
# Entra-only auth is already in force and no SQL credential ever exists
az sql server ad-only-auth enable --resource-group $ResourceGroup `
    --server-name $deployment.properties.outputs.sqlServerName.value

Concesiones de permisos de Graph. La identidad administrada del App Service necesita estos permisos de aplicación de Microsoft Graph: Mail.Send, User.ReadBasic.All, TeamsAppInstallation.ReadForUser.All, Application.Read.All, AppCatalog.Read.All y (activado de forma predeterminada, con opción de exclusión) AiEnterpriseInteraction.Read.All para la captura de Copilot. La vía más sencilla es la página Finalizar instalación — la salida de implementación finishSetupUrl — que los concede todos en un único pase idempotente mediante el inicio de sesión delegado de un Administrador global. Para concederlos mediante CLI en su lugar:

$graphSpId = az ad sp show --id "00000003-0000-0000-c000-000000000000" --query id -o tsv

$permissions = @(
    @{ Name = "Mail.Send";                            Id = "b633e1c5-b582-4048-a93e-9f11b44c7e96" }
    @{ Name = "User.ReadBasic.All";                   Id = "97235f07-e226-4f63-ace3-39588e11d3a1" }
    @{ Name = "TeamsAppInstallation.ReadForUser.All"; Id = "9ce09611-f4f7-4abd-a629-a05450422a97" }
    @{ Name = "Application.Read.All";                 Id = "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30" }
    @{ Name = "AppCatalog.Read.All";                  Id = "e12dae10-5a57-4817-b79d-dfbec5348930" }
    # Copilot capture (tenant-wide) — granted by default; remove this line to opt out:
    @{ Name = "AiEnterpriseInteraction.Read.All";     Id = "839c90ab-5771-41ee-aef8-a562e8487c1e" }
)

foreach ($perm in $permissions) {
    $bodyFile = [System.IO.Path]::GetTempFileName()
    @{ principalId = $principalId; resourceId = $graphSpId; appRoleId = $perm.Id } |
        ConvertTo-Json | Set-Content -Path $bodyFile -Encoding utf8
    az rest --method POST `
        --uri "https://graph.microsoft.com/v1.0/servicePrincipals/$principalId/appRoleAssignments" `
        --body "@$bodyFile" --headers "Content-Type=application/json" --output none
    Remove-Item $bodyFile
}

# Full stop/start (NOT restart) clears the managed identity token cache
az webapp stop  --name $appName --resource-group $ResourceGroup
Start-Sleep -Seconds 10
az webapp start --name $appName --resource-group $ResourceGroup

Verificación: navegue a https://<api-url>/api/health y confirme que la respuesta es correcta.

Capacidades de IA opcionales

La plantilla expone cuatro capacidades opcionales, ninguna necesaria para ejecutar AccessPoint. Asistencia con IA, AI Search y Document Intelligence están desactivadas a menos que las habilite en el momento de la implementación; el permiso de captura de Copilot se concede de forma predeterminada, pero puede optar por no concederlo (el formulario Deploy to Azure, -p name=value en az deployment o los modificadores de Deploy-AccessPoint.ps1 indicados a continuación controlan las cuatro). Todos los recursos de IA se implementan en su propia suscripción de Azure con autenticación exclusiva de identidad administrada: ningún dato del cliente sale de su inquilino y Microsoft no entrena modelos con él.

  • Implementar Asistencia con IA (Azure OpenAI) — añade un recurso de Azure OpenAI a su suscripción con autenticación de identidad administrada (sin claves de API). La facturación es de pago por uso, de modo que un inquilino inactivo paga alrededor de $0 y un departamento con mucha actividad suele gastar unos pocos dólares al mes. Al implementarla se habilitan las funciones de Asistencia con IA, cada una activable de forma individual en Configuración > Funciones. Cada resultado de la IA es una sugerencia o un borrador editable — siempre es una persona quien decide.
  • Implementar AI Search (deployAiSearch=true) — añade Azure AI Search para que el cuadro de búsqueda de Documentos coincida con palabras que están dentro de los documentos (el texto extraído de los PDF), además de con los nombres, tipos y etiquetas; si también se ha implementado Asistencia con IA, admite la búsqueda semántica. Los documentos nuevos se indexan automáticamente, y un barrido de Administrador (Configuración > Configuración inicial > Búsqueda en el contenido de documentos) indexa los que sean anteriores.
  • Implementar Document Intelligence (deployDocumentIntelligence=true) — añade Azure AI Document Intelligence para OCR: los documentos escaneados solo con imagen tienen su texto leído para que participen en la búsqueda de contenido, la detección de duplicados, los resúmenes con IA y las sugerencias de tachado como cualquier otro documento. La facturación es de pago por página (aproximadamente USD $1.50 por cada 1000 páginas). Sin él, los documentos escaneados siguen coincidiendo por nombre, tipo y etiquetas.
  • Permiso de captura de Copilot (AiEnterpriseInteraction.Read.All) — este permiso de Graph para todo el inquilino se concede de forma predeterminada, de modo que los custodios pueden capturar el historial de interacciones de Copilot mediante Documentos > Agregar desde Microsoft 365 desde el primer momento. Es un permiso exclusivo de aplicación (Microsoft Graph no ofrece una variante delegada), pero AccessPoint solo lee el propio historial de Copilot del usuario que ha iniciado sesión. Los inquilinos que apliquen el principio de privilegio mínimo pueden optar por no concederlo con Deploy-AccessPoint.ps1 -DisableCopilotCapture (o grantCopilotCapturePermission=false en la plantilla ARM/Bicep) y revocar el rol de aplicación en Entra ID en cualquier momento; los cinco permisos de Graph estándar anteriores no se ven afectados.

Paso 2: Instalar las aplicaciones de AccessPoint

Instale primero la solución de SharePoint y, a continuación, la aplicación de Teams.

Solución de SharePoint. En la ficha de AppSource, haga clic en Obtenerlo ahora y apruébela en su catálogo de aplicaciones de SharePoint, implementada en todo el inquilino. Como alternativa, cárguela manualmente (Centro de administración de SharePoint > Más características > Aplicaciones > Cargar, marque «Hacer que esta solución esté disponible en todos los sitios») o deje que el script lo haga.

Solución de AccessPoint en el catálogo de aplicaciones de SharePoint

Aplicación de Teams. En la ficha de AppSource, haga clic en Obtenerlo ahora y apruébela en el Centro de administración de Teams, o instale ambas aplicaciones mediante el script (el usuario que ha iniciado sesión debe ser administrador de SharePoint y, además, administrador de Teams o administrador global):

.\Deploy-AccessPoint.ps1 `
    -SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
    -SkipInfrastructure -SkipGraphPermissions `
    -DeploySharePointApp -DeployTeamsApp

NO use la función «Sincronizar con Teams» de SharePoint. Anula de forma silenciosa el valor webApplicationInfo.id del manifiesto, lo que rompe las notificaciones de la fuente de actividad de Teams. Cargue la aplicación de Teams directamente en el Centro de administración de Teams.

Verificación: la solución aparece en el catálogo de aplicaciones sin errores y AccessPoint se muestra como Permitida en Centro de administración de Teams > Administrar aplicaciones.

Paso 3: Aprobar los permisos de la API

El paquete SPFx solicita permisos delegados que un administrador de SharePoint debe aprobar. En el Centro de administración de SharePoint, vaya a Avanzado > Acceso a API y apruebe cada solicitud pendiente de AccessPoint: access_as_user en la API de AccessPoint, además de los ámbitos de Graph para los selectores de personas y las fuentes de captura de Agregar desde Microsoft 365 — User.Read.All, Sites.Read.All, Files.Read.All, Mail.Read y Mail.Read.Shared (buzones propios y compartidos/de recepción), Calendars.Read y Calendars.Read.Shared, Chat.Read, ChannelMessage.Read.All, Team.ReadBasic.All, Channel.ReadBasic.All (chats y canales de Teams), y Notes.Read y Notes.Read.All (OneNote). Los ámbitos .Shared nunca amplían el acceso por sí solos — Graph sigue aplicando los permisos de buzón de Exchange que ya tiene cada usuario.

Aprobación de solicitudes de permisos de la API de AccessPoint

La solicitud pendiente seleccionada, con Aprobar y Rechazar disponibles

O bien apruébelos mediante PnP PowerShell:

Connect-PnPOnline -Url "https://contoso-admin.sharepoint.com" -Interactive

$spfxPermissions = @(
    @{ Resource = "ed19c96c-a7c5-4dca-8b47-0899c406329f"; Scope = "access_as_user" }
    @{ Resource = "Microsoft Graph"; Scope = "User.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Sites.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Files.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Mail.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Mail.Read.Shared" }
    @{ Resource = "Microsoft Graph"; Scope = "Calendars.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Calendars.Read.Shared" }
    @{ Resource = "Microsoft Graph"; Scope = "Chat.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "ChannelMessage.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Team.ReadBasic.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Channel.ReadBasic.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Notes.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Notes.Read.All" }
)
foreach ($perm in $spfxPermissions) {
    Grant-PnPTenantServicePrincipalPermission -Scope $perm.Scope -Resource $perm.Resource
}

Por último, un Administrador global concede el consentimiento del administrador para la aplicación multiinquilino del publicador abriendo https://login.microsoftonline.com/common/adminconsent?client_id=ed19c96c-a7c5-4dca-8b47-0899c406329f en un navegador.

Verificación: la página de acceso a API no muestra ninguna solicitud pendiente de AccessPoint.

Paso 4: Usar AccessPoint en SharePoint o Teams

SharePoint: edite o cree una página, haga clic en +, busque AccessPoint, agregue el elemento web y publique.

Teams: los usuarios encuentran AccessPoint en Aplicaciones > Creado para su organización (la indexación de búsqueda puede tardar entre 15 minutos y varias horas después de la primera instalación). De forma opcional, ánclelo para todos mediante Centro de administración de Teams > Directivas de instalación de aplicaciones, agregando AccessPoint a Aplicaciones instaladas y Aplicaciones ancladas.

Paso 5: Configuración de la URL de la API (normalmente automática)

El elemento web detecta la URL de la API automáticamente. La API de AccessPoint autorregistra su dirección en la plataforma Realizer cuando valida su licencia —a los pocos minutos de iniciarse el App Service— y el elemento web la obtiene desde allí. En la mayoría de las implementaciones no hay nada que hacer aquí.

Verificación: vuelva a cargar el elemento web: se carga el panel en lugar del aviso de instalación. Si acaba de implementar la API, la detección se completa correctamente en la siguiente carga de la página, tras la primera validación de licencia correcta.

Establecer la URL de la API manualmente (opcional)

Solo lo necesita para anular la detección —por ejemplo, para fijar el elemento web a un dominio personalizado.

Opción A: Panel de instalación. Abra el elemento web, vaya a Configuración > Instalación, escriba la URL de la API (la URL del App Service del Paso 1, p. ej., https://app-accesspoint-contoso.azurewebsites.net) y haga clic en Guardar. El panel valida HTTPS antes de guardar, y una URL manual tiene prioridad sobre la detección automática.

Configuración de la URL de la API en el panel de Instalación

Opción B: Entidad de almacenamiento (PowerShell). Fije la URL en una entidad de almacenamiento AccessPoint_ApiUrl, que tiene prioridad sobre la detección. Desde enero de 2026, SharePoint bloquea las escrituras en la bolsa de propiedades del catálogo de aplicaciones sin scripts (centro de mensajes MC1186368), por lo que un administrador de SharePoint debe permitirlas una vez, en todo el inquilino, antes de que se pueda escribir la entidad de almacenamiento:

# One-time (SharePoint admin): allow property-bag updates on no-script sites
Set-SPOTenant -AllowWebPropertyBagUpdateWhenDenyAddAndCustomizePagesIsEnabled $true

Connect-PnPOnline -Url "https://contoso.sharepoint.com" -Interactive
$appCatalogUrl = Get-PnPTenantAppCatalogUrl
Connect-PnPOnline -Url $appCatalogUrl -Interactive   # storage entities live on the App Catalog site

Set-PnPStorageEntity -Key "AccessPoint_ApiUrl" -Value $apiUrl -Description "AccessPoint API base URL"
Get-PnPStorageEntity -Key "AccessPoint_ApiUrl"       # verify

Paso 6: Importar un paquete de jurisdicción

Vaya a Configuración > Paquetes de jurisdicción, elija el paquete para su jurisdicción (ATIA de Canadá, FOIA de EE. UU., GDPR de la UE, entre otros) y haga clic en Importar. El paquete crea tipos de solicitud, motivos de prórroga, campos de opción, plantillas de notificación y traducciones. Revise y personalice los elementos importados posteriormente.

Paso 7: Asignar roles de usuario

Al primer usuario que abre AccessPoint se le concede automáticamente el rol de Administrador — el único rol integrado, que siempre resuelve con todos los permisos. Cualquier otro rol lo define el inquilino: importar un paquete de jurisdicción siembra roles ya preparados (como Coordinador de solicitudes, el rol de facto de oficial de acceso y privacidad), y puede renombrarlos o remodelarlos en Configuración > Roles y permisos. Vaya a Configuración > Administrar usuarios, haga clic en Agregar usuario, busque en su directorio y asigne al menos un Administrador y un coordinador; el acceso de Custodio, Colaborador, Revisor y Lector se deriva automáticamente del trabajo que asigne a las personas.

AccessPoint ya está listo para su uso.

Actualización de AccessPoint

AccessPoint le indica cuando hay una versión más reciente disponible — no hay nada a lo que suscribirse ni que consultar manualmente:

  • Durante la validación de licencia habitual, la Plataforma Realizer informa la última versión publicada de AccessPoint (la versión promovida más recientemente al canal de publicación para clientes). En esta comprobación no interviene ningún dato de uso ni de casos.
  • Cuando la versión publicada es más reciente que la que ejecuta su API, los administradores ven un aviso de Actualización disponible en el panel y en Configuración inicial, que muestra los números de la versión actual y de la más reciente.
  • Cuando está al día (o ejecuta una compilación preliminar más reciente que la versión publicada), Configuración inicial muestra «Su API de AccessPoint está actualizada».

Para aplicar una actualización:

  1. En Configuración > Configuración inicial, haga clic en Implementar actualización en Azure. Esto abre el portal de Azure con la plantilla ARM más reciente — la misma plantilla que se usa en la implementación inicial.
  2. Elija el tipo de implementación Actualizar instalación existente. Esto conserva la configuración de aplicación añadida por el operador y no toca el acceso a la base de datos; el esquema de la base de datos se actualiza automáticamente al iniciar la API (migración DacPac).
  3. Actualice el paquete SPFx: cargue el accesspoint.sppkg más reciente en su catálogo de aplicaciones (Paso 2 anterior). Actualice el paquete de la aplicación de Teams en el Centro de administración de Teams si se publicó un nuevo accesspoint-teams.zip.
  4. Vuelva a visitar la página Finalizar instalación después de actualizar — concede de forma idempotente cualquier permiso de Graph introducido desde su implementación original.

Datos de muestra para inquilinos de evaluación. Para entornos de demostración y evaluación, un elemento web independiente, AccessPoint DevTools (accesspoint-devtools.sppkg), puede restablecer un inquilino y sembrar datos de muestra apropiados para la jurisdicción — usuarios ficticios, solicitudes, asignaciones y documentos generados — con un Reconstruir demostración de un solo clic. Reutiliza la conexión de API de la aplicación principal y declara sus propios permisos de API (apruébelos una vez en Administración de SharePoint > Avanzado > Acceso a API). No apto para producción: los puntos de conexión de restablecimiento destructivo solo se activan cuando se establece la configuración del App Service DevTools:Enabled=true — implemente el paquete únicamente en inquilinos de desarrollo o demostración.

Privacidad de los datos de notificación de Teams (opcional)

Todos los registros de solicitudes, la PII del solicitante, los documentos y el historial de auditoría residen únicamente en su propio inquilino. Las notificaciones también respetan esto. AccessPoint entrega cada notificación en hasta tres canales, y dos de ellos nunca salen de su inquilino: el feed integrado (servido desde su propia API) y el correo electrónico/Outlook (enviado desde su propio buzón compartido mediante Mail.Send). La fuente de actividad de Teams es el único canal que, en su modo predeterminado, envía (POST) una pequeña carga útil a la API de Realizer Platform — que existe únicamente porque Microsoft Graph exige que la notificación de actividad la envíe la aplicación propietaria del manifiesto de Teams. El editor no almacena nada de eso y solo registra los GUID del destinatario y del inquilino, y las mismas notificaciones igualmente llegan por correo electrónico y en la aplicación. Dos controles restringen o eliminan incluso esto:

Minimizar (un interruptor). En Configuración > Configuración inicial > Notificaciones de Teams, active Minimizar el contenido de las notificaciones de Teams (privacidad). La carga útil retransmitida entonces reemplaza el título/texto de vista previa de la notificación y el nombre del usuario que realiza la acción con marcadores de posición neutros, de modo que ningún nombre de asignación/tarea, texto de notificación o nombre personal sale del inquilino — solo el tipo de actividad, el número de solicitud y los identificadores de registro siguen transitando para que el aviso pueda enrutarse y usar el vínculo profundo. El texto completo sigue mostrándose en el feed integrado. No se requiere ningún cambio en el manifiesto. (Internamente: la configuración de inquilino Notifications:TeamsMinimalPayload.)

Eliminar (autoalojar la retransmisión). Un inquilino que no deba enviar ningún dato de notificación al editor puede hacer que su propia API llame directamente a Graph con su identidad administrada, de modo que nada llegue a api.realizer.io:

  1. Conceda TeamsActivity.Send (de aplicación) a la identidad administrada de la API y otorgue el consentimiento del administrador — Graph solo permite que la aplicación propietaria del manifiesto de Teams envíe notificaciones de actividad, por lo que la identidad que envía debe coincidir con el webApplicationInfo.id del manifiesto.
  2. Apunte el manifiesto de Teams a su propia aplicación. En manifest.json, establezca webApplicationInfo.id con el ID de cliente de su registro de aplicación / identidad administrada de la API (en reemplazo del id de la aplicación del editor), dejando webApplicationInfo.resource como el dominio del sitio de SharePoint. Cargue el archivo zip editado directamente en el Centro de administración de Teams — no utilice la función «Sincronizar con Teams» de SharePoint (reescribe webApplicationInfo).
  3. Cambie la API al modo de retransmisión directa — agregue la configuración del App Service Notifications__TeamsRelayMode=Direct (el valor predeterminado/sin definir es Publisher) y reinicie. La API ahora llama ella misma a sendActivityNotification; la concesión de la aplicación empresarial del editor ya no es necesaria para las notificaciones.
  4. Vuelva a validar — envíe una notificación de prueba (confirme que el vínculo profundo funciona) y confirme que la pestaña personal de Teams todavía inicia sesión correctamente, ya que cambió webApplicationInfo.id.

La retransmisión directa mantiene el 100 % del contenido de las notificaciones dentro del inquilino, pero implica mantener un manifiesto de Teams personalizado y volver a otorgar el consentimiento cuando cambia el id de la aplicación. La mayoría de los inquilinos que solo necesitan suprimir el texto libre y los nombres personales deberían usar en su lugar el interruptor Minimizar — sin cambios en el manifiesto, y la notificación sigue usando el vínculo profundo.

Implementación multiinquilino

Use este patrón cuando el backend de Azure resida en un inquilino de Entra ID diferente del de su inquilino de Microsoft 365: un equipo de servicios compartidos que atiende a varias unidades de negocio, un MSP que aloja para clientes, o inquilinos de Azure y M365 separados por motivos de gobernanza. Una única implementación puede servir a varios inquilinos de M365: la API aísla los datos según el id. de inquilino incluido en el token de cada usuario, con filtros de consulta de base de datos limitados por inquilino y rutas de blob con prefijo de inquilino. Cada inquilino de M365 sigue necesitando su propia licencia, su propia implementación de SPFx y aprobaciones de permisos de la API, y sus propias credenciales de Graph y buzón de notificaciones.

Registro de aplicación de Graph. Una identidad administrada solo funciona en su inquilino de origen, por lo que debe crear un registro de aplicación de un solo inquilino en el inquilino de M365 (p. ej., AccessPoint Graph Connector), concederle los mismos permisos de aplicación de Graph enumerados en el Paso 1 con el consentimiento del administrador y, a continuación, crear un secreto de cliente y conectarlo al App Service a través de Key Vault:

# In the M365 tenant: create the client secret
$secret = az ad app credential reset --id $appId --display-name "AccessPoint" --years 2 --query password -o tsv

# In the Azure subscription: store the secret and reference it from the App Service
az keyvault secret set --vault-name $vaultName --name "GraphClientSecret" --value $secret

az webapp config appsettings set --resource-group $ResourceGroup --name $appName --settings `
    "Graph__TenantId=$m365TenantId" `
    "Graph__ClientId=$appId" `
    "Graph__ClientSecret=@Microsoft.KeyVault(SecretUri=https://$vaultName.vault.azure.net/secrets/GraphClientSecret)"

az webapp restart --resource-group $ResourceGroup --name $appName

Nunca almacene el secreto directamente en la configuración del App Service; la identidad administrada del App Service necesita el rol Usuario de secretos de Key Vault sobre el almacén. Cuando están presentes las tres configuraciones Graph__*, la API usa el registro de aplicación; cuando faltan, recurre a la identidad administrada para las implementaciones en el mismo inquilino.

Buzón compartido y directiva de acceso a aplicaciones. Cree un buzón compartido sin licencia en el inquilino de M365 para las notificaciones por correo electrónico y limite el ámbito de Mail.Send para que la aplicación solo pueda enviar desde ese único buzón:

Connect-ExchangeOnline -Organization "contoso.onmicrosoft.com"

New-Mailbox -Name "AccessPoint Notifications" -Alias "accesspoint-noreply" -Shared

New-DistributionGroup -Name "AccessPoint Mail Senders" -Type Security -ManagedBy "admin@contoso.com"
Add-DistributionGroupMember -Identity "AccessPoint Mail Senders" -Member "accesspoint-noreply@contoso.com"

New-ApplicationAccessPolicy -AppId $appId -PolicyScopeGroupId "AccessPoint Mail Senders" `
    -AccessRight RestrictAccess -Description "AccessPoint may send only from the shared mailbox"

# Verify (propagation can take up to 30 minutes)
Test-ApplicationAccessPolicy -AppId $appId -Identity "accesspoint-noreply@contoso.com"   # expect: Granted
Test-ApplicationAccessPolicy -AppId $appId -Identity "someother@contoso.com"             # expect: Denied

Después, cada inquilino de M365 repite los Pasos 2 a 5 (aplicaciones, aprobaciones, URL de la API: la misma URL de la API sirve a todos los inquilinos). Las notificaciones de la fuente de actividad de Teams requieren además el consentimiento del administrador para la aplicación empresarial de Realizer y que la aplicación de Teams esté instalada para los usuarios; consulte Configuración inicial para más detalles.

Reversión y operaciones

Los mecanismos estándar de Azure cubren la reversión: vuelva a implementar un paquete de API anterior desde el historial del Centro de implementación del App Service, restaure Azure SQL con la restauración a un momento dado (hasta 35 días) y vuelva a cargar una versión anterior del .sppkg en el catálogo de aplicaciones. Las importaciones de paquetes de jurisdicción son aditivas y se revierten mediante la restauración de la base de datos. Para obtener el manual de operaciones completo (procedimientos detallados de reversión, supervisión y tareas de mantenimiento), póngase en contacto con nuestro equipo de soporte.