Skip to content

Commit b0f98fe

Browse files
Copilotanushakolan
andcommitted
Align CLI implementation with PR #3151 - rename to UserDelegatedAuthOptions and add provider field
Co-authored-by: anushakolan <[email protected]>
1 parent 099435a commit b0f98fe

7 files changed

Lines changed: 71 additions & 74 deletions

File tree

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "8.0.418",
3+
"version": "8.0.417",
44
"rollForward": "latestFeature"
55
}
66
}

src/Cli.Tests/UserDelegatedAuthRuntimeParsingTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ public void TestRuntimeCanParseUserDelegatedAuthConfig()
5353
Assert.IsNotNull(config.DataSource.UserDelegatedAuth);
5454
Assert.IsTrue(config.DataSource.UserDelegatedAuth.Enabled);
5555
Assert.AreEqual("https://database.windows.net", config.DataSource.UserDelegatedAuth.DatabaseAudience);
56-
Assert.AreEqual(50, config.DataSource.UserDelegatedAuth.EffectiveTokenCacheDurationMinutes);
57-
Assert.IsTrue(config.DataSource.UserDelegatedAuth.EffectiveDisableConnectionPooling);
5856
}
5957

6058
[TestMethod]

src/Cli/ConfigGenerator.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ private static bool TryUpdateConfiguredDataSourceOptions(
643643
DatabaseType dbType = runtimeConfig.DataSource.DatabaseType;
644644
string dataSourceConnectionString = runtimeConfig.DataSource.ConnectionString;
645645
DatasourceHealthCheckConfig? datasourceHealthCheckConfig = runtimeConfig.DataSource.Health;
646-
UserDelegatedAuthConfig? userDelegatedAuthConfig = runtimeConfig.DataSource.UserDelegatedAuth;
646+
UserDelegatedAuthOptions? userDelegatedAuthConfig = runtimeConfig.DataSource.UserDelegatedAuth;
647647

648648
if (options.DataSourceDatabaseType is not null)
649649
{
@@ -735,16 +735,21 @@ private static bool TryUpdateConfiguredDataSourceOptions(
735735
string? databaseAudience = options.DataSourceUserDelegatedAuthDatabaseAudience
736736
?? userDelegatedAuthConfig?.DatabaseAudience;
737737

738+
// Get provider: preserve existing or use default "EntraId"
739+
string? provider = userDelegatedAuthConfig?.Provider ?? "EntraId";
740+
738741
// Create or update user-delegated-auth config
739-
userDelegatedAuthConfig = new UserDelegatedAuthConfig(
742+
userDelegatedAuthConfig = new UserDelegatedAuthOptions(
740743
Enabled: enabled,
741-
DatabaseAudience: databaseAudience,
742-
DisableConnectionPooling: userDelegatedAuthConfig?.DisableConnectionPooling,
743-
TokenCacheDurationMinutes: userDelegatedAuthConfig?.TokenCacheDurationMinutes);
744+
Provider: provider,
745+
DatabaseAudience: databaseAudience);
744746
}
745747

746748
dbOptions = EnumerableUtilities.IsNullOrEmpty(dbOptions) ? null : dbOptions;
747-
DataSource dataSource = new(dbType, dataSourceConnectionString, dbOptions, datasourceHealthCheckConfig, userDelegatedAuthConfig);
749+
DataSource dataSource = new(dbType, dataSourceConnectionString, dbOptions, datasourceHealthCheckConfig)
750+
{
751+
UserDelegatedAuth = userDelegatedAuthConfig
752+
};
748753
runtimeConfig = runtimeConfig with { DataSource = dataSource };
749754

750755
return runtimeConfig != null;

src/Config/Converters/DataSourceConverterFactory.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,16 @@ public DataSourceConverter(DeserializationVariableReplacementSettings? replaceme
5151
string connectionString = string.Empty;
5252
DatasourceHealthCheckConfig? health = null;
5353
Dictionary<string, object?>? datasourceOptions = null;
54-
UserDelegatedAuthConfig? userDelegatedAuth = null;
54+
UserDelegatedAuthOptions? userDelegatedAuth = null;
5555

5656
while (reader.Read())
5757
{
5858
if (reader.TokenType is JsonTokenType.EndObject)
5959
{
60-
return new DataSource(databaseType, connectionString, datasourceOptions, health, userDelegatedAuth);
60+
return new DataSource(databaseType, connectionString, datasourceOptions, health)
61+
{
62+
UserDelegatedAuth = userDelegatedAuth
63+
};
6164
}
6265

6366
if (reader.TokenType is JsonTokenType.PropertyName)
@@ -98,7 +101,7 @@ public DataSourceConverter(DeserializationVariableReplacementSettings? replaceme
98101
{
99102
try
100103
{
101-
userDelegatedAuth = JsonSerializer.Deserialize<UserDelegatedAuthConfig>(ref reader, options);
104+
userDelegatedAuth = JsonSerializer.Deserialize<UserDelegatedAuthOptions>(ref reader, options);
102105
}
103106
catch (Exception e)
104107
{

src/Config/ObjectModel/DataSource.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ namespace Azure.DataApiBuilder.Config.ObjectModel;
1414
/// <param name="ConnectionString">Connection string to access the database.</param>
1515
/// <param name="Options">Custom options for the specific database. If there are no options, this could be null.</param>
1616
/// <param name="Health">Health check configuration for the datasource.</param>
17-
/// <param name="UserDelegatedAuth">User-delegated authentication configuration (OBO). Optional.</param>
1817
public record DataSource(
1918
DatabaseType DatabaseType,
2019
string ConnectionString,
2120
Dictionary<string, object?>? Options = null,
22-
DatasourceHealthCheckConfig? Health = null,
23-
UserDelegatedAuthConfig? UserDelegatedAuth = null)
21+
DatasourceHealthCheckConfig? Health = null)
2422
{
2523
[JsonIgnore]
2624
public bool IsDatasourceHealthEnabled =>
@@ -42,6 +40,13 @@ public int DatasourceThresholdMs
4240
}
4341
}
4442

43+
/// <summary>
44+
/// Configuration for user-delegated authentication (OBO) against the
45+
/// configured database.
46+
/// </summary>
47+
[JsonPropertyName("user-delegated-auth")]
48+
public UserDelegatedAuthOptions? UserDelegatedAuth { get; init; }
49+
4550
/// <summary>
4651
/// Converts the <c>Options</c> dictionary into a typed options object.
4752
/// May return null if the dictionary is null.

src/Config/ObjectModel/UserDelegatedAuthConfig.cs

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Text.Json.Serialization;
5+
6+
namespace Azure.DataApiBuilder.Config.ObjectModel;
7+
8+
/// <summary>
9+
/// Configuration for user-delegated authentication (OBO - On-Behalf-Of).
10+
/// Enables per-user Entra ID access token authentication to Azure SQL.
11+
/// </summary>
12+
/// <param name="Enabled">Whether user-delegated authentication is enabled.</param>
13+
/// <param name="Provider">Identity provider for user-delegated authentication.</param>
14+
/// <param name="DatabaseAudience">The Azure SQL resource identifier for token acquisition.</param>
15+
public record UserDelegatedAuthOptions(
16+
[property: JsonPropertyName("enabled")] bool Enabled = false,
17+
[property: JsonPropertyName("provider")] string? Provider = null,
18+
[property: JsonPropertyName("database-audience")] string? DatabaseAudience = null)
19+
{
20+
/// <summary>
21+
/// Default duration, in minutes, to cache tokens for a given delegated identity.
22+
/// With a 5-minute early refresh buffer, tokens are refreshed at the 40-minute mark.
23+
/// </summary>
24+
public const int DEFAULT_TOKEN_CACHE_DURATION_MINUTES = 45;
25+
26+
/// <summary>
27+
/// Environment variable name for OBO App Registration client ID.
28+
/// Uses DAB-specific prefix to avoid conflict with AZURE_CLIENT_ID which is
29+
/// interpreted by DefaultAzureCredential/ManagedIdentityCredential as a
30+
/// User-Assigned Managed Identity ID.
31+
/// </summary>
32+
public const string AZURE_CLIENT_ID_ENV_VAR = "DAB_OBO_CLIENT_ID";
33+
34+
/// <summary>
35+
/// Environment variable name for OBO App Registration client secret.
36+
/// Used for On-Behalf-Of token exchange.
37+
/// </summary>
38+
public const string AZURE_CLIENT_SECRET_ENV_VAR = "DAB_OBO_CLIENT_SECRET";
39+
40+
/// <summary>
41+
/// Environment variable name for OBO tenant ID.
42+
/// Uses DAB-specific prefix for consistency with OBO client ID.
43+
/// </summary>
44+
public const string AZURE_TENANT_ID_ENV_VAR = "DAB_OBO_TENANT_ID";
45+
}

0 commit comments

Comments
 (0)