Design and Implement a GenAIOps Infrastructure · Topic 1 of 4
Foundry Resources, Projects and Access Control
AI-300 GenAIOps: create Foundry resources and projects per environment, then secure them with managed identities, Azure RBAC roles and Entra ID.
- 5 min
- Resource holds deployments, connections and security settings; the project is the team workspace.
- Disable local auth to force Entra ID authentication.
- Use groups, least privilege and the narrowest scope.
What it is
A Microsoft Foundry resource is the top-level Azure resource for AI work. It holds model deployments, shared connections and the settings for networking, identity and security. A project is a child of that resource and is the working space where a team keeps its agents, files, evaluations and project level connections. Apps call a project endpoint.
Identity is controlled by Microsoft Entra ID and Azure RBAC. People and apps get the smallest role that does the job, and apps use managed identities rather than keys.
How it works
Resource and project layout
| Design choice | Guidance |
|---|---|
| One resource per environment | Separate dev, test and prod resources so quotas, access, networking and deployments stay isolated |
| One project per team or application | Projects isolate files, agents and evaluations while sharing the resource's model deployments |
| Naming and tags | Use a consistent pattern and tags for owner, environment and cost centre |
| Region | Choose the region for data residency, model availability and quota |
Foundry also still supports the older hub based projects, which are built on Azure Machine Learning workspaces. Know that both exist, but new designs start with the Foundry resource and its projects.
Create them with Bicep
param location string = resourceGroup().location
param foundryName string
param projectName string
resource foundry 'Microsoft.CognitiveServices/accounts@2025-06-01' = {
name: foundryName
location: location
kind: 'AIServices'
sku: { name: 'S0' }
identity: { type: 'SystemAssigned' }
properties: {
allowProjectManagement: true
customSubDomainName: foundryName
disableLocalAuth: true
}
}
resource project 'Microsoft.CognitiveServices/accounts/projects@2025-06-01' = {
parent: foundry
name: projectName
location: location
identity: { type: 'SystemAssigned' }
properties: {
displayName: projectName
description: 'Customer support assistant'
}
}
Two properties matter here. allowProjectManagement: true lets the resource hold projects. disableLocalAuth: true turns off API keys so only Entra ID tokens work.
Connect the project to other services
Add connections for services such as Azure AI Search, storage and Application Insights. Prefer connections that authenticate with Entra ID, and grant the project's managed identity the data role it needs on the target (for example Search Index Data Reader on Azure AI Search or Storage Blob Data Reader on storage).
Roles for people
| Role | Typical holder | What it allows |
|---|---|---|
| Foundry User (formerly Azure AI User) | Developers | Build and run in a project: call deployments, use agents, run evaluations (data actions); cannot create projects or accounts |
| Foundry Project Manager (formerly Azure AI Project Manager) | Team leads | Manage projects, build in them, and assign Foundry User to others |
| Foundry Account Owner (formerly Azure AI Account Owner) | Platform admins | Create and manage Foundry accounts and projects and manage models; no build data actions |
| Reader / Contributor / Owner | General Azure roles | Management plane access; Contributor and Owner do not by themselves imply the data permissions of Foundry User |
Microsoft renamed these roles, so portals and exam items may show either name. The role IDs and permissions did not change. For Foundry work, do not assign roles whose names start with Cognitive Services, except Cognitive Services Usages Reader at subscription scope when users need to see quota.
Assign roles at the narrowest scope that works (project before resource before resource group), to Entra groups rather than individuals, and use Privileged Identity Management for elevated roles.
Managed identities for applications
An app hosted on Azure (App Service, Container Apps, Functions, AKS) gets a system assigned or user assigned managed identity. The code calls the endpoint with DefaultAzureCredential, and that identity holds a role on the Foundry resource or project.
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
client = AIProjectClient(
endpoint="https://<resource>.services.ai.azure.com/api/projects/<project>",
credential=DefaultAzureCredential(),
)
Use a user assigned identity when several services share one identity or when you need it to exist before the app does. Locally, DefaultAzureCredential uses the developer's own signed in account, so the same code runs everywhere with no keys.
A worked example
A company creates foundry-dev and foundry-prod resources with one project per app. Developers are in an Entra group with Foundry User on the dev project only. The production web app runs with a managed identity that holds Foundry User on foundry-prod, and key based authentication is disabled.
How the exam asks about this
- "Developers can run and evaluate in a project but cannot manage accounts." Foundry User (formerly Azure AI User) on the project.
- "The app must call the model with no secret in configuration." Managed identity plus a role assignment.
- "Isolate production deployments and quota from experiments." Separate Foundry resources per environment.
What to remember for the exam
- Resource holds deployments, connections and security settings; the project is the team workspace.
- Disable local auth to force Entra ID authentication.
- Use groups, least privilege and the narrowest scope.
- System assigned identities share the lifecycle of the resource; user assigned identities are independent.
- Grant the project identity data roles on connected services.
Owner or Contributor on the Azure resource is not the same as the data permissions needed to build in a project. Assign the Azure AI roles.
Common mistakes
Sharing one resource for dev and prod. Experiments then consume production quota and share access rules.
Distributing API keys. Keys cannot be scoped to a user and are hard to rotate. Use Entra ID.
Granting at subscription scope. It gives access to far more than the team needs.
Check yourself
Which role lets a developer build in a project but not manage accounts?
Foundry User, formerly named Azure AI User.
What does
disableLocalAuth: truedo?It disables key based authentication so only Microsoft Entra ID tokens are accepted.
Why use separate Foundry resources per environment?
To isolate access, quota, networking and deployments between dev, test and prod.
Topic 1 of 4 in Design and Implement a GenAIOps Infrastructure
Test yourself on Design and Implement a GenAIOps Infrastructure
The full Microsoft AI-300 question bank has 650 questions, with timed practice exams and an explanation for every answer.
This study guide is independent and is not affiliated with, endorsed by, or sponsored by Microsoft. Vendor names, certification names and exam codes are trademarks of their respective owners and are used for identification only.