As mentioned here, you can use Azure AD Apps for the Client Credential Flow for Service Accounts. It is not optimal but it works.
- Define an Azure AD App for the Web API
- Define an Azure AD App per Service Account
- Configure the Web API to accept tokens from your B2C Tenant and Azure AD
- Request an access token against the Service Account AD App for the Web API
Note: be sure to create the Azure AD Apps under your B2C Tenant.
Code Snippet to get an Access Token from C#
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("https://login.microsoftonline.com");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "client_credentials")
, new KeyValuePair<string, string>("client_id", "[service account app id e.g. 10d635e5-7615-472f-8200-a81d5c87c0ca")
, new KeyValuePair<string, string>("client_secret", "[client secret defined in the service account e.g. 5L2ZJOBK8GI1wRSgGFooHcBkAOUOj65lQd9DgJxQOrw=]")
, new KeyValuePair<string, string>("scope", "[App ID URI of the web api azure ad app]/.default e.g. https://my-b2c-tenant.onmicrosoft.com/my-azure-ad-ap/.default")
});
var requestResult = await httpClient.PostAsync("/[your b2c tenant].onmicrosoft.com/oauth2/v2.0/token", content);
var contentResult = await requestResult.Content.ReadAsStringAsync();
var json = JObject.Parse(contentResult);
var accessToken = (string)json["access_token"];
}
App ID URI
You will probably want to define some custom claim(s) to secure the Web API. See 'Application Permissions' here.
Modify the application manifest on the Web API Azure AD App
{
"appRoles": [{
"allowedMemberTypes": [
"Application"
],
"displayName": "Some display nane",
"id": "[create a new guid]",
"isEnabled": true,
"description": "Allow the application to _____ as itself.",
"value": "the-blah-role"
}
]
}
Grant the Service Account Azure AD App permission to the custom application permission(s) defined
The permissions granted to the service account will come back in the roles
claim:
{
"roles": [
"the-blah-role"
]
}
Please upvote the user voice feedback item to make this easier 😀