I'm trying to set up custom claims for Client Credentials auth flow in Azure AD.
Using Graph Client in C#.
However, I do not get my claim in token.
The flow I'm using currently is following:
- Create an Application
- Create Service Principal
- Create Extension Property on Application
- Create Claims Mapping Policy
- Add Additional Data to Application - assign value to extension property
- Assign Claims Mapping Policy to Service Principal
Creating extension property:
await _graphClient.Applications[app.Id].ExtensionProperties.Request()
.AddAsync(new ExtensionProperty
{
Name = policyName,
DataType = "String",
TargetObjects = new List<string> { "Application" }
});
Creating Claims Mapping Policy:
string appClientIdFormatted = clientId.Replace("-", null);
var claimsMappingPolicy = new ClaimsMappingPolicy
{
Definition = new List<String>()
{
"{" +
"\"ClaimsMappingPolicy\":{" +
"\"Version\":1," +
"\"IncludeBasicClaimSet\":\"true\", " +
"\"ClaimsSchema\": [" +
"{" +
"\"Source\":\"application\"," +
$"\"ExtensionID\":\"extension_{appClientIdFormatted}_{policyName}\"," +
$"\"JwtClaimType\":\"{policyName}\"" +
"}" +
"]" +
"}" +
"}"
},
DisplayName = displayName,
IsOrganizationDefault = true
};
await _graphClient.Policies.ClaimsMappingPolicies.Request()
.AddAsync(claimsMappingPolicy);
Assigning value to extension property
var clientIdFormatted = app.AppId.Replace("-", null);
await _graphClient.Applications[app.Id].Request().UpdateAsync(new Application
{
AdditionalData = new Dictionary<string, object>
{
{ $"extension_{clientIdFormatted}_{policyName}", tenantId }
}
});
Is there something I'm missing?