Skip to content

Commit 5658c1c

Browse files
replacing DefaultAzureCredential with ManagedIdentityCredential
1 parent 09b67ea commit 5658c1c

10 files changed

Lines changed: 63 additions & 11 deletions

File tree

infra/deploy_app_service.bicep

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,10 @@ resource Website 'Microsoft.Web/sites@2020-06-01' = {
298298
name: 'UWSGI_THREADS'
299299
value: '2'
300300
}
301+
{
302+
name: 'APP_ENV'
303+
value: 'Prod'
304+
}
301305
]
302306
linuxFxVersion: imageName
303307
}

infra/scripts/index_scripts/01_create_search_index.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def get_secrets_from_kv(secret_name: str) -> str:
3232
str: The secret value.
3333
"""
3434
kv_credential = DefaultAzureCredential(managed_identity_client_id=managed_identity_client_id)
35+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
3536
secret_client = SecretClient(
3637
vault_url=f"https://{key_vault_name}.vault.azure.net/",
3738
credential=kv_credential
@@ -44,6 +45,7 @@ def create_search_index():
4445

4546
# Shared credential
4647
credential = DefaultAzureCredential(managed_identity_client_id=managed_identity_client_id)
48+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
4749

4850
# Retrieve secrets from Key Vault
4951
search_endpoint = get_secrets_from_kv("AZURE-SEARCH-ENDPOINT")

infra/scripts/index_scripts/02_process_data.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def get_secrets_from_kv(secret_name: str) -> str:
2727
str: The secret value.
2828
"""
2929
kv_credential = DefaultAzureCredential(managed_identity_client_id=managed_identity_client_id)
30+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
3031
secret_client = SecretClient(
3132
vault_url=f"https://{key_vault_name}.vault.azure.net/",
3233
credential=kv_credential
@@ -45,6 +46,7 @@ def get_secrets_from_kv(secret_name: str) -> str:
4546
# Azure Data Lake settings
4647
account_url = f"https://{account_name}.dfs.core.windows.net"
4748
credential = DefaultAzureCredential(managed_identity_client_id=managed_identity_client_id)
49+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
4850
service_client = DataLakeServiceClient(account_url, credential=credential, api_version='2023-01-03')
4951
file_system_client = service_client.get_file_system_client(file_system_client_name)
5052
directory_name = directory

scripts/chunk_documents.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def get_document_intelligence_client(config, secret_client):
5858
config = json.load(f)
5959

6060
credential = DefaultAzureCredential()
61+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
6162

6263
if type(config) is not list:
6364
config = [config]

scripts/embed_documents.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
config = json.load(f)
2121

2222
credential = DefaultAzureCredential()
23+
# CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in local environment.
2324

2425
if type(config) is not list:
2526
config = [config]

src/app.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import asyncio
99
from typing import Dict, Any, AsyncGenerator
1010

11-
from azure.identity.aio import DefaultAzureCredential
12-
from azure.identity import DefaultAzureCredential as DefaultAzureCredentialSync
11+
12+
from backend.helpers.azure_credential_utils import get_azure_credential
13+
from backend.helpers.azure_credential_utils import get_azure_credential_async
1314
from quart import (Blueprint, Quart, jsonify, make_response, render_template,
1415
request, send_from_directory)
1516

@@ -169,7 +170,7 @@ async def init_ai_foundry_client():
169170

170171
ai_project_client = AIProjectClient(
171172
endpoint=app_settings.azure_ai.agent_endpoint,
172-
credential=DefaultAzureCredential()
173+
credential=get_azure_credential()
173174
)
174175
track_event_if_configured("AIFoundryAgentEndpointUsed", {
175176
"endpoint": app_settings.azure_ai.agent_endpoint
@@ -193,7 +194,7 @@ def init_cosmosdb_client():
193194
)
194195

195196
if not app_settings.chat_history.account_key:
196-
credential = DefaultAzureCredential()
197+
credential = get_azure_credential()
197198
else:
198199
credential = app_settings.chat_history.account_key
199200

@@ -1163,7 +1164,7 @@ async def fetch_azure_search_content():
11631164
return jsonify({"error": "URL and title are required"}), 400
11641165

11651166
# Get Azure AD token
1166-
credential = DefaultAzureCredentialSync()
1167+
credential = await get_azure_credential_async()
11671168
token = credential.get_token("https://search.azure.com/.default")
11681169
access_token = token.token
11691170

src/backend/api/agent/browse_agent_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from azure.ai.projects.aio import AIProjectClient
22
from azure.ai.agents.models import AzureAISearchTool, AzureAISearchQueryType
3-
from azure.identity.aio import DefaultAzureCredential
3+
from backend.helpers.azure_credential_utils import get_azure_credential
44
from backend.settings import app_settings
55
from event_utils import track_event_if_configured
66

@@ -20,7 +20,7 @@ async def create_or_get_agent(cls):
2020
"""
2121
project_client = AIProjectClient(
2222
endpoint=app_settings.azure_ai.agent_endpoint,
23-
credential=DefaultAzureCredential(exclude_interactive_browser_credential=False),
23+
credential=get_azure_credential(),
2424
api_version=app_settings.azure_ai.agent_api_version
2525
)
2626

src/backend/api/agent/section_agent_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from azure.ai.projects.aio import AIProjectClient
22
from azure.ai.agents.models import AzureAISearchTool, AzureAISearchQueryType
3-
from azure.identity.aio import DefaultAzureCredential
3+
from backend.helpers.azure_credential_utils import get_azure_credential
44
from backend.settings import app_settings
55
from event_utils import track_event_if_configured
66

@@ -19,7 +19,7 @@ async def create_or_get_agent(cls):
1919
"""
2020
project_client = AIProjectClient(
2121
endpoint=app_settings.azure_ai.agent_endpoint,
22-
credential=DefaultAzureCredential(exclude_interactive_browser_credential=False),
22+
credential=get_azure_credential(),
2323
api_version=app_settings.azure_ai.agent_api_version
2424
)
2525

src/backend/api/agent/template_agent_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from azure.ai.projects.aio import AIProjectClient
22
from azure.ai.agents.models import AzureAISearchTool, AzureAISearchQueryType
3-
from azure.identity.aio import DefaultAzureCredential
3+
from backend.helpers.azure_credential_utils import get_azure_credential
44
from backend.settings import app_settings
55
from event_utils import track_event_if_configured
66

@@ -20,7 +20,7 @@ async def create_or_get_agent(cls):
2020
"""
2121
project_client = AIProjectClient(
2222
endpoint=app_settings.azure_ai.agent_endpoint,
23-
credential=DefaultAzureCredential(exclude_interactive_browser_credential=False),
23+
credential=get_azure_credential(),
2424
api_version=app_settings.azure_ai.agent_api_version
2525
)
2626

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import os
2+
from azure.identity import ManagedIdentityCredential, DefaultAzureCredential
3+
from azure.identity.aio import ManagedIdentityCredential as AioManagedIdentityCredential, DefaultAzureCredential as AioDefaultAzureCredential
4+
5+
6+
async def get_azure_credential_async(client_id=None):
7+
"""
8+
Returns an Azure credential asynchronously based on the application environment.
9+
10+
If the environment is 'dev', it uses AioDefaultAzureCredential.
11+
Otherwise, it uses AioManagedIdentityCredential.
12+
13+
Args:
14+
client_id (str, optional): The client ID for the Managed Identity Credential.
15+
16+
Returns:
17+
Credential object: Either AioDefaultAzureCredential or AioManagedIdentityCredential.
18+
"""
19+
if os.getenv("APP_ENV", "prod").lower() == 'dev':
20+
return AioDefaultAzureCredential() # CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in development
21+
else:
22+
return AioManagedIdentityCredential(client_id=client_id)
23+
24+
25+
def get_azure_credential(client_id=None):
26+
"""
27+
Returns an Azure credential based on the application environment.
28+
29+
If the environment is 'dev', it uses DefaultAzureCredential.
30+
Otherwise, it uses ManagedIdentityCredential.
31+
32+
Args:
33+
client_id (str, optional): The client ID for the Managed Identity Credential.
34+
35+
Returns:
36+
Credential object: Either DefaultAzureCredential or ManagedIdentityCredential.
37+
"""
38+
if os.getenv("APP_ENV", "prod").lower() == 'dev':
39+
return DefaultAzureCredential() # CodeQL [SM05139] Okay use of DefaultAzureCredential as it is only used in development
40+
else:
41+
return ManagedIdentityCredential(client_id=client_id)

0 commit comments

Comments
 (0)