Skip to content

Commit b84937d

Browse files
initial
1 parent 44a6142 commit b84937d

File tree

12 files changed

+142
-25
lines changed

12 files changed

+142
-25
lines changed

src/client/Microsoft.Identity.Client/ApiConfig/Parameters/AcquireTokenForManagedIdentityParameters.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ internal class AcquireTokenForManagedIdentityParameters : IAcquireTokenParameter
1616

1717
public string Resource { get; set; }
1818

19+
public string Claims { get; set; }
20+
1921
public void LogParameters(ILoggerAdapter logger)
2022
{
2123
if (logger.IsLoggingEnabled(LogLevel.Info))

src/client/Microsoft.Identity.Client/Internal/Requests/ManagedIdentityAuthRequest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ protected override async Task<AuthenticationResult> ExecuteAsync(CancellationTok
3636
// Skip checking cache when force refresh or claims is specified
3737
if (_managedIdentityParameters.ForceRefresh || !string.IsNullOrEmpty(AuthenticationRequestParameters.Claims))
3838
{
39+
_managedIdentityParameters.Claims = AuthenticationRequestParameters.Claims;
3940
AuthenticationRequestParameters.RequestContext.ApiEvent.CacheInfo = CacheRefreshReason.ForceRefreshOrClaims;
4041

4142
logger.Info("[ManagedIdentityRequest] Skipped looking for a cached access token because ForceRefresh or Claims were set. " +

src/client/Microsoft.Identity.Client/ManagedIdentity/AbstractManagedIdentity.cs

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
using System.Net;
1313
using Microsoft.Identity.Client.ApiConfig.Parameters;
1414
using System.Text;
15+
using System.Collections.Generic;
16+
using System.Linq;
1517
#if SUPPORTS_SYSTEM_TEXT_JSON
1618
using System.Text.Json;
1719
#else
@@ -48,7 +50,7 @@ public virtual async Task<ManagedIdentityResponse> AuthenticateAsync(
4850
// Convert the scopes to a resource string.
4951
string resource = parameters.Resource;
5052

51-
ManagedIdentityRequest request = CreateRequest(resource);
53+
ManagedIdentityRequest request = CreateRequest(resource, parameters);
5254

5355
_requestContext.Logger.Info("[Managed Identity] Sending request to managed identity endpoints.");
5456

@@ -130,7 +132,7 @@ protected virtual Task<ManagedIdentityResponse> HandleResponseAsync(
130132
throw exception;
131133
}
132134

133-
protected abstract ManagedIdentityRequest CreateRequest(string resource);
135+
protected abstract ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters);
134136

135137
protected ManagedIdentityResponse GetSuccessfulResponse(HttpResponse response)
136138
{
@@ -298,5 +300,54 @@ private static void CreateAndThrowException(string errorCode,
298300

299301
throw exception;
300302
}
303+
304+
/// <summary>
305+
/// Sets the claims and capabilities in the request.
306+
/// </summary>
307+
/// <param name="request"></param>
308+
/// <param name="parameters"></param>
309+
protected virtual void ApplyClaimsAndCapabilities(
310+
ManagedIdentityRequest request,
311+
AcquireTokenForManagedIdentityParameters parameters)
312+
{
313+
IEnumerable<string> clientCapabilities = _requestContext.ServiceBundle.Config.ClientCapabilities;
314+
315+
// If claims are present, set bypass_cache=true
316+
if (!string.IsNullOrEmpty(parameters.Claims))
317+
{
318+
SetRequestParameter(request, "bypass_cache", "true");
319+
_requestContext.Logger.Info("[Managed Identity] Setting bypass_cache=true in the Managed Identity request due to claims.");
320+
321+
// Set xms_cc only if clientCapabilities exist
322+
if (clientCapabilities != null && clientCapabilities.Any())
323+
{
324+
SetRequestParameter(request, "xms_cc", string.Join(",", clientCapabilities));
325+
_requestContext.Logger.Info("[Managed Identity] Adding client capabilities (xms_cc) to Managed Identity request.");
326+
}
327+
}
328+
else
329+
{
330+
SetRequestParameter(request, "bypass_cache", "false");
331+
_requestContext.Logger.Info("[Managed Identity] Setting bypass_cache=false (no claims provided).");
332+
}
333+
}
334+
335+
/// <summary>
336+
/// Sets the request parameter in either the query or body based on the request method.
337+
/// </summary>
338+
/// <param name="request"></param>
339+
/// <param name="key"></param>
340+
/// <param name="value"></param>
341+
protected void SetRequestParameter(ManagedIdentityRequest request, string key, string value)
342+
{
343+
if (request.Method == HttpMethod.Post)
344+
{
345+
request.BodyParameters[key] = value;
346+
}
347+
else
348+
{
349+
request.QueryParameters[key] = value;
350+
}
351+
}
301352
}
302353
}

src/client/Microsoft.Identity.Client/ManagedIdentity/AppServiceManagedIdentitySource.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Globalization;
7+
using System.Linq;
8+
using Microsoft.Identity.Client.ApiConfig.Parameters;
79
using Microsoft.Identity.Client.Core;
810
using Microsoft.Identity.Client.Internal;
911
using Microsoft.Identity.Client.Utils;
@@ -13,7 +15,7 @@ namespace Microsoft.Identity.Client.ManagedIdentity
1315
internal class AppServiceManagedIdentitySource : AbstractManagedIdentity
1416
{
1517
// MSI Constants. Docs for MSI are available here https://docs.microsoft.com/azure/app-service/overview-managed-identity
16-
private const string AppServiceMsiApiVersion = "2019-08-01";
18+
private const string AppServiceMsiApiVersion = "2025-03-30";
1719
private const string SecretHeaderName = "X-IDENTITY-HEADER";
1820

1921
private readonly Uri _endpoint;
@@ -65,14 +67,16 @@ private static bool TryValidateEnvVars(string msiEndpoint, ILoggerAdapter logger
6567
return true;
6668
}
6769

68-
protected override ManagedIdentityRequest CreateRequest(string resource)
70+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
6971
{
7072
ManagedIdentityRequest request = new(System.Net.Http.HttpMethod.Get, _endpoint);
7173

7274
request.Headers.Add(SecretHeaderName, _secret);
7375
request.QueryParameters["api-version"] = AppServiceMsiApiVersion;
7476
request.QueryParameters["resource"] = resource;
7577

78+
ApplyClaimsAndCapabilities(request, parameters);
79+
7680
switch (_requestContext.ServiceBundle.Config.ManagedIdentityId.IdType)
7781
{
7882
case AppConfig.ManagedIdentityIdType.ClientId:

src/client/Microsoft.Identity.Client/ManagedIdentity/AzureArcManagedIdentitySource.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,16 @@ private AzureArcManagedIdentitySource(Uri endpoint, RequestContext requestContex
7878
}
7979
}
8080

81-
protected override ManagedIdentityRequest CreateRequest(string resource)
81+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
8282
{
8383
ManagedIdentityRequest request = new ManagedIdentityRequest(System.Net.Http.HttpMethod.Get, _endpoint);
8484

8585
request.Headers.Add("Metadata", "true");
8686
request.QueryParameters["api-version"] = ArcApiVersion;
8787
request.QueryParameters["resource"] = resource;
88+
request.QueryParameters["bypass_cache"] = "false";
89+
90+
ApplyClaimsAndCapabilities(request, parameters);
8891

8992
return request;
9093
}
@@ -118,7 +121,7 @@ protected override async Task<ManagedIdentityResponse> HandleResponseAsync(
118121

119122
var authHeaderValue = "Basic " + File.ReadAllText(splitChallenge[1]);
120123

121-
ManagedIdentityRequest request = CreateRequest(parameters.Resource);
124+
ManagedIdentityRequest request = CreateRequest(parameters.Resource, parameters);
122125

123126
_requestContext.Logger.Verbose(() => "[Managed Identity] Adding authorization header to the request.");
124127
request.Headers.Add("Authorization", authHeaderValue);

src/client/Microsoft.Identity.Client/ManagedIdentity/CloudShellManagedIdentitySource.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Globalization;
66
using System.Net.Http;
7+
using Microsoft.Identity.Client.ApiConfig.Parameters;
78
using Microsoft.Identity.Client.Core;
89
using Microsoft.Identity.Client.Internal;
910

@@ -73,14 +74,16 @@ private CloudShellManagedIdentitySource(Uri endpoint, RequestContext requestCont
7374
}
7475
}
7576

76-
protected override ManagedIdentityRequest CreateRequest(string resource)
77+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
7778
{
7879
ManagedIdentityRequest request = new ManagedIdentityRequest(HttpMethod.Post, _endpoint);
7980

8081
request.Headers.Add("ContentType", "application/x-www-form-urlencoded");
8182
request.Headers.Add("Metadata", "true");
8283

8384
request.BodyParameters.Add("resource", resource);
85+
86+
ApplyClaimsAndCapabilities(request, parameters);
8487

8588
return request;
8689
}

src/client/Microsoft.Identity.Client/ManagedIdentity/ImdsManagedIdentitySource.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,16 @@ internal ImdsManagedIdentitySource(RequestContext requestContext) :
5656
requestContext.Logger.Verbose(() => "[Managed Identity] Creating IMDS managed identity source. Endpoint URI: " + _imdsEndpoint);
5757
}
5858

59-
protected override ManagedIdentityRequest CreateRequest(string resource)
59+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
6060
{
6161
ManagedIdentityRequest request = new(HttpMethod.Get, _imdsEndpoint);
6262

6363
request.Headers.Add("Metadata", "true");
6464
request.QueryParameters["api-version"] = ImdsApiVersion;
6565
request.QueryParameters["resource"] = resource;
6666

67+
ApplyClaimsAndCapabilities(request, parameters);
68+
6769
switch (_requestContext.ServiceBundle.Config.ManagedIdentityId.IdType)
6870
{
6971
case AppConfig.ManagedIdentityIdType.ClientId:

src/client/Microsoft.Identity.Client/ManagedIdentity/MachineLearningManagedIdentitySource.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Globalization;
6+
using Microsoft.Identity.Client.ApiConfig.Parameters;
67
using Microsoft.Identity.Client.Core;
78
using Microsoft.Identity.Client.Internal;
89

@@ -62,7 +63,7 @@ private static bool TryValidateEnvVars(string msiEndpoint, ILoggerAdapter logger
6263
return true;
6364
}
6465

65-
protected override ManagedIdentityRequest CreateRequest(string resource)
66+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
6667
{
6768
ManagedIdentityRequest request = new(System.Net.Http.HttpMethod.Get, _endpoint);
6869

@@ -71,6 +72,8 @@ protected override ManagedIdentityRequest CreateRequest(string resource)
7172
request.QueryParameters["api-version"] = MachineLearningMsiApiVersion;
7273
request.QueryParameters["resource"] = resource;
7374

75+
ApplyClaimsAndCapabilities(request, parameters);
76+
7477
switch (_requestContext.ServiceBundle.Config.ManagedIdentityId.IdType)
7578
{
7679
case AppConfig.ManagedIdentityIdType.ClientId:

src/client/Microsoft.Identity.Client/ManagedIdentity/ServiceFabricManagedIdentitySource.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Globalization;
66
using System.Net.Http;
77
using System.Net.Security;
8+
using Microsoft.Identity.Client.ApiConfig.Parameters;
89
using Microsoft.Identity.Client.Core;
910
using Microsoft.Identity.Client.Internal;
1011

@@ -32,9 +33,9 @@ public static AbstractManagedIdentity Create(RequestContext requestContext)
3233
var exception = MsalServiceExceptionFactory.CreateManagedIdentityException(
3334
MsalError.InvalidManagedIdentityEndpoint,
3435
errorMessage,
35-
null,
36+
null,
3637
ManagedIdentitySource.ServiceFabric,
37-
null);
38+
null);
3839

3940
throw exception;
4041
}
@@ -54,7 +55,7 @@ internal override bool ValidateServerCertificate(HttpRequestMessage message, Sys
5455
return string.Equals(certificate.GetCertHashString(), EnvironmentVariables.IdentityServerThumbprint, StringComparison.OrdinalIgnoreCase);
5556
}
5657

57-
private ServiceFabricManagedIdentitySource(RequestContext requestContext, Uri endpoint, string identityHeaderValue) :
58+
private ServiceFabricManagedIdentitySource(RequestContext requestContext, Uri endpoint, string identityHeaderValue) :
5859
base(requestContext, ManagedIdentitySource.ServiceFabric)
5960
{
6061
_endpoint = endpoint;
@@ -66,7 +67,7 @@ private ServiceFabricManagedIdentitySource(RequestContext requestContext, Uri en
6667
}
6768
}
6869

69-
protected override ManagedIdentityRequest CreateRequest(string resource)
70+
protected override ManagedIdentityRequest CreateRequest(string resource, AcquireTokenForManagedIdentityParameters parameters)
7071
{
7172
ManagedIdentityRequest request = new ManagedIdentityRequest(HttpMethod.Get, _endpoint);
7273

@@ -75,6 +76,8 @@ protected override ManagedIdentityRequest CreateRequest(string resource)
7576
request.QueryParameters["api-version"] = ServiceFabricMsiApiVersion;
7677
request.QueryParameters["resource"] = resource;
7778

79+
ApplyClaimsAndCapabilities(request, parameters);
80+
7881
switch (_requestContext.ServiceBundle.Config.ManagedIdentityId.IdType)
7982
{
8083
case AppConfig.ManagedIdentityIdType.ClientId:

0 commit comments

Comments
 (0)