Démarrage rapide IA
Cette solution vous emmène d’un dossier vide à un portail en cours où les clients se connectent et travaillent avec leurs propres dossiers de support — en demandant à un agent de codage IA plutôt qu’en écrivant à la main. Chaque étape vous propose une invite à coller, ce que l’agent en fera et quoi vérifier avant de passer à la suite. L’exemple utilise la table des cas (incident) fournie avec le service client de Dynamics 365 ; avec votre propre tableau, chaque invite fonctionne de la même manière.
Avant que tu commences
- Le SDK .NET 10, et Node.js si vous choisissez le modèle React.
- Un environnement Dataverse dans lequel vous êtes administrateur système. Utilisez un environnement de développement ou bac à sable pour cette solution de passage.
- Permission de créer des inscriptions d’applications dans le locataire Entra de cet environnement.
- Une adresse pour l’adresse e-mail du portail — confirmations d’inscription et réinitialisations de mot de passe — avec une boîte aux lettres partagée dans Exchange Online, qui ne nécessite pas de licence. L’approbation de l’adresse nécessite un Office 365 Global Administrator ou Exchange Administrator.
- Un agent de codage IA qui prend en charge MCP. Les commandes ci-dessous concernent Claude Code ; la page MCP Server contient la configuration pour Visual Studio, VS Code et Cursor.
Comment cela fonctionne
Deux choses permettent à un agent de bien faire cela plutôt que de simplement être plausible : le serveur Power Portals Pro MCP, qui lit votre environnement Dataverse réel et effectue les modifications de configuration dont un portail a besoin, et les instructions que chaque projet généré envoie aux agents.
- Chaque modification vous demande en premier. Avant qu’une inscription à une application, l’utilisateur de l’application ou un rôle de sécurité ne soit créé, des privilèges accordés ou une solution installée, l’agent vous montre ce qui va se passer — l’action, la cible, le coût, l’effet et comment l’annuler — puis vous l’approuvez ou refusez dans une requête en une ligne. Lisez les détails : ce sont votre étape de révision.
- Le projet possède le savoir-faire. Un projet généré comprend une
AGENTS.mdet trois compétences —set-up-portal,secure-a-tableetadd-table-pages— qui indiquent à l’agent quelles questions poser et dans quel ordre. Vous n’avez pas besoin de les nommer ; les consignes ci-dessous suffisent à l’agent pour choisir la bonne. - Les consignes sont un point de départ. Exprimez-les avec vos propres mots si vous voulez. Ce qui compte, c’est ce qu’ils disent : à qui s’adresse le portail, quelles données ces personnes devraient voir, et ce qu’elles peuvent en faire.
1. Installer le serveur MCP
Installez-le une fois par machine, à portée utilisateur, afin qu’il soit disponible dans chaque dossier — y compris celui vide dans lequel vous allez créer le projet :
claude mcp add --scope user powerportalspro -- dnx PowerPortalsPro.Mcp --yes
dnxlivré avec le SDK .NET 10. Redémarrez votre agent s’il était déjà en marche, puis vérifiez que le serveur est là en posant une question à laquelle il seul peut répondre, comme « utiliser get_component_api pour lister les paramètres de MainGrid ».
2. Créer un dossier et se connecter
Créez le dossier dans lequel votre portail sera installé, et connectez-vous depuis l’intérieur — une fois vers votre environnement Dataverse, et une fois vers Azure, qui est par là où sont créées les inscriptions aux applications à l’étape 4 :
mkdir C:\Code\Contoso.Portal
cd C:\Code\Contoso.Portal
dnx PowerPortalsPro.Mcp login --environment https://yourorg.crm.dynamics.com
dnx PowerPortalsPro.Mcp azure login
Les deux connexions appartiennent à ce dossier, pas à la machine. Ils écrivent .ppp/mcp.json ici, nomment l’environnement et le locataire, et gardent vos tokens dans votre profil utilisateur, afin qu’un projet dans un autre dossier puisse pointer vers un autre client en même temps. Les deux utilisent un code de dispositif, donc vous pouvez les terminer sur votre téléphone. Si votre compte voit plusieurs abonnements Azure, vous n’avez pas besoin d’en choisir un encore — cela n’a d’importance qu’une fois déployé. Puis lancez votre agent dans ce dossier.
3. Créer le projet
Dites à l’agent ce que vous construisez — quelle stack, React ou Blazor, et qui se connectera :
Créez un nouveau portail Power Portals Pro dans ce dossier appelé Contoso.Portal, en utilisant le modèle React. Il s’adresse à nos clients, qui s’inscriront et se connecteront avec leurs propres comptes.
L’agent installe les modèles de projet s’ils manquent, pose des questions sur tout ce qu’il ne peut pas détecter de votre demande, et exécute dotnet new. Chaque client devient un contact dans Dataverse, et ce qu’il peut voir est décidé par les enregistrements de sécurité dans le Program.csfichier . C’est le modèle de sécurité par défaut du modèle, et celui utilisé par le reste de cette guide. L’une ou l’autre pile fonctionne ; chaque prompt ultérieur est identique.
Note
Redémarrez votre agent dans le même dossier une fois que le projet existe. Le projet apporte son propre
.mcp.json, qui épingle le serveur MCP à la version correspondant à ses paquets, ainsi que ses compétences etAGENTS.md— et la plupart des agents ne lisent ces éléments qu’au début. Approuvez le serveur MCP du projet si votre agent le demande.
4. Connectez-le à Dataverse
Un nouveau projet ne commencera pas tant qu’il n’aura pas atteint Dataverse. Demandez à l’agent de le configurer :
Configurez ce portail contre mon environnement Dataverse pour qu’il fonctionne localement. Ne donnez pas à l’utilisateur de l’application Administrateur Système : utilisez le rôle Power Portals Pro, plus un rôle à nous pour nos tables. Envoyez l’email du portail depuis noreply@contoso.com.
L’agent suit la compétence du set-up-portal projet, en commençant par check_setup voir ce qui manque. Attendez-vous à approuver chacun de ces éléments :
- La solution gérée — les tables Power Portals Pro, la vérification des licences et le rôle de sécurité utilisateur de l’application Power Portals Pro.
- Une inscription à l’application Entra que le portail relie à Dataverse. Son secret client va directement dans les secrets utilisateur du projet, jamais dans la conversation.
- L’utilisateur de l’application Dataverse pour cette inscription, avec le rôle d’utilisateur Power Portals Pro Application et le profil de sécurité de colonne dont le framework a besoin, plus un rôle de sécurité vide à vous. Le rôle Power Portals Pro couvre uniquement les tables propres au framework ; vos tables vont dans votre rôle, à l’étape 6.
- Une seconde inscription à l’application « Connexion avec Microsoft » — seulement si vous voulez ce bouton. Les clients avec leurs propres comptes n’en ont pas besoin.
- Une file d’attente d’e-mails depuis laquelle les emails d’enregistrement et de réinitialisation de mot de passe sont envoyés. L’agent approuve son adresse et exécute Test & Enable sur sa boîte aux lettres. Deux choses peuvent vous être laissées : l’adresse nécessite une boîte aux lettres dans Exchange Online — une boîte aux lettres partagée, qui ne nécessite pas de licence — et son approbation nécessite un Office 365 Global Administrator ou Exchange Administrator. Si l’un des deux manque, l’agent indique lequel ; corrigez-le et demandez à l’agent de relancer l’étape.
Les paramètres de connexion s’affichent dans les secrets utilisateur du projet à chaque étape terminée. L’agent termine en relançant check_setup ; une fois que c’est propre, lancez le projet — F5, ou dotnet run dans le projet serveur — et vous verrez la page d’accueil et les pages d’échantillons du modèle.
5. Décider ce que les clients doivent voir
Décrivez le résultat que vous souhaitez en termes professionnels, et laissez l’agent trouver la table. Demander avant que quoi que ce soit soit écrit en vaut la peine : l’agent lit votre environnement, ce qui suggère ce qui est réellement là, avec vos propres tables et colonnes personnalisées incluses.
Les clients qui se connectent doivent consulter les dossiers de support qu’ils ont ouverts, en ouvrir un pour en voir les détails, et enregistrer un nouveau dossier. Quelles tables et quelles colonnes devons-nous utiliser ? Ne changez rien pour l’instant.
Attendez-vous à ce qu’il consulte la table avec list_tables et describe_table, lise ses vues avec list_views, et revienne avec la table des cas (incident), la recherche qui relie un dossier à son client (customerid), et les colonnes à afficher et à modifier. Ajustez cette liste maintenant : c’est elle qui décide ce que le portail publie.
6. Sécuriser la table
Un portail ne montre rien qu’on ne lui ait pas demandé de montrer : tant qu’une table n’est pas enregistrée, ses pages reviennent 403 ou une grille vide. Demandez à l’agent d’ouvrir la table — seulement dans la mesure où vous l’avez prévu :
Sécurisez la table des cas : les clients connectés ne peuvent lire, créer et modifier que leurs propres cas, avec les colonnes convenues. Ils choisissent la priorité lors de l’enregistrement d’un dossier mais ne peuvent pas la modifier par la suite. Donner à notre propre rôle de sécurité les privilèges dont l’utilisateur de l’application a besoin sur les cas.
L’agent travaille à travers la compétence du secure-a-table projet, confirmant à qui s’adresse l’accès, quelles lignes, quelles opérations et quelles colonnes. N’en saute aucune : chaque réponse change ce qui est publié.
Ensuite, il écrit l’enregistrement dans le projet Program.csserveur . Pour cet exemple, attendez-vous à quelque chose comme :
builder.Services.AddTableAccess("incident", t => t
.ForSignedInUsers()
.RowsOwnedByContact("customerid")
.Allow(TableSecurityPermission.Read | TableSecurityPermission.Create | TableSecurityPermission.Write)
.Reading("title", "ticketnumber", "prioritycode", "statuscode", "createdon", "description")
.Writing("title", "description")
.WritingOnCreate("prioritycode"));
RowsOwnedByContact("customerid") Limite chaque requête aux propres cas du contact connecté, et fait de lui le client d’un dossier qu’il crée. Les colonnes sont en option : tout ce qui n’est pas nommé Reading est retenu, et seules les colonnes Writing peuvent être modifiées. WritingOnCreate Couvre la priorité — définie lors de l’enregistrement du dossier, en lecture seule à partir de ce moment. La sécurité couvre toutes les options.
Le rôle propre de l’utilisateur de l’application
L’enregistrement décide de ce que chaque client peut faire, mais le portail communique toujours avec Dataverse en tant qu’utilisateur de l’application, et cet utilisateur a besoin de privilèges sur la table elle-même. Ils vont dans votre propre rôle de sécurité à partir de l’étape 4, jamais dans le rôle Power Portals Pro. L’agent :
- Trouve votre rôle sur l’utilisateur de l’application avec
get_application_user— et si l’étape 4 n’en a pas créé, il le crée aveccreate_security_roleet l’assigne àassign_application_user_role. - Cela lui accorde ce dont l’enregistrement a besoin avec
add_table_privileges_to_role: Lire, Créer, Écrire et Ajouter surincident, et Ajouter àcontactsur , car chaque nouveau cas est lié à un contact. Ensuite, il exécutecheck_setup, qui compare les tables utilisées par vos pages avec celles que votre code enregistre.
Pourquoi avoir un rôle à part ?
Le rôle Power Portals Pro est livré dans une solution gérée. Dataverse vous permettrait d’y ajouter des privilèges, mais la prochaine mise à niveau de cette solution peut le remettre dans la version originale, emportant vos subventions — donc le serveur MCP refuse d’ajouter des privilèges à un rôle géré. Un rôle à vous montre aussi à quiconque examine l’environnement par la suite ce que le portail peut atteindre.
7. Ajouter les pages
Une fois la table sécurisée, demandez les deux pages en une seule fois — la liste dans le menu, et la page où un dossier s’ouvre :
Ajoutez une page Cas au menu principal avec une grille des dossiers du client connecté, et la page où s’ouvre un dossier : titre, numéro de cas, priorité et statut dans une section, la description dans une autre. Les clients peuvent changer le titre et la description, ne définir la priorité que lors de la création d’un nouveau dossier, et rien d’autre.
L’agent suit la compétence du add-table-pages projet. Il ajoute les itinéraires, une page de liste avec une MainGrid, l’entrée du menu et une RecordContext page qui s’ouvre également vide pour enregistrer un nouveau cas. Il lit les identifiants de vues réelles avec list_views plutôt que d’écrire des espaces réservés, et garde chaque colonne dans ce que l’enregistrement permet aux clients de lire — les vues Dynamics d’origine incluent des colonnes uniquement pour l’agent, donc attendez-vous à ce qu’elles offrent leurs propres vues. Si vous demandez une colonne que l’enregistrement laisse de côté, il devrait s’arrêter et demander plutôt que d’élargir discrètement l’accès. Les enregistrements associés peuvent aller sur la page du dossier sous forme de sous-grilles ; nommez-les, et cela sécurisera aussi cette table.
8. Essayez en tant que deux clients
L’agent ne peut pas se connecter en tant que client, donc cette partie vous appartient. C’est aussi le test qui compte le plus : le but de l’inscription, c’est ce qu’un client ne peut pas voir.
- Ouvrez le portail et enregistrez un client. L’email de confirmation arrive une fois que la boîte aux lettres de la file d’attente a passé Test & Enable à l’étape 4.
- Ouvrez des dossiers, enregistrez un nouveau dossier, puis rouvrez-le depuis la grille. Changez son titre et enregistrez.
- Déconnectez-vous, enregistrez un second client et ouvrez les Dossiers. La grille doit être vide : le dossier du premier client lui appartient seul. Coller l’adresse de ce dossier dans cette session ne devrait pas non plus l’afficher.
Si l’un des clients voit quelque chose qu’il ne devrait pas, ne l’ajustez pas à la main. Dites à l’agent ce que vous avez vu et ce que vous attendiez, et laissez la chose fonctionner secure-a-table à nouveau.
Si quelque chose ne va pas
- La grille est vide, ou la page retourne 403. Demandez à l’agent de lancer
check_setup: une table utilisée par vos pages sans enregistrement la couvrant y est indiquée. Sinon, le client n’a peut-être tout simplement pas encore de cas. - Une colonne est toujours vide. Elle n’est pas dans la liste de
Readingl’enregistrement. Les colonnes sont retenues sauf si elles sont nommées, volontairement. - Chaque demande de données retourne 402. La vérification de licence a échoué — généralement parce que la solution gérée n’est pas encore installée.
check_setupdit lequel. - Le portail ne démarre pas, ou affiche « Certains contenus sont indisponibles ». Il ne peut pas se connecter à Dataverse. Le début
Could not connect to Dataversede la ligne de journal indique le paramètre à corriger, etcheck_setuple signale également.
Où aller ensuite
- Ajoutez plus de tableaux de la même façon : étape 5 pour choisir, étape 6 pour sécuriser, étape 7 pour les pages.
- Donnez plus d’accès à certains clients que d’autres ayant des rôles sur le portail — demandez à l’agent un rôle comme gestionnaire de cas qui examine chaque cas de l’entreprise du client. La sécurité explique comment les rôles s’ajoutent aux inscriptions à l’échelle du portail.
- Déployez-le. « Déploiez ce portail vers Azure » lance le déploiement Azure, avec sa propre connexion et un prix pour chaque ressource avant sa création.
- Vous préférez les rôles web et les permissions de table de Power Pages ? Créez le projet avec
--EnableEnhancedAuthorization true. L’accès provient alors des rôles de sécurité Dataverse plutôt queProgram.cs— voir Sécurité Dataverse.
