I could be wrong, but I never saw any scenario where such parametes should be passed in the header.
In order to receive a token, this requires you a simple KeyValuePair (FORM, in other words) containing few parameters such as grant_type and client id.
Take a look on my code...this prob can help you to understand...
var formContent = new FormUrlEncodedContent(new[]{
new KeyValuePair<string, string>("client_id", "My Client Id Here),
new KeyValuePair<string, string>("scope", "Your scope"),
new KeyValuePair<string, string>("grant_type", "client_credentials"),
});
var loginResponse = await Http.PostAsync("https://xxxx.b2clogin.com/xxxxonmicrosoft.com/B2C_1_LOGIN/oauth2/v2.0/token", formContent);
AccessToken dataReceived = await loginResponse.Content.ReadFromJsonAsync<AccessToken>();
This works...basically I start a POST whose the content is a form and the response will be the token
I hope this can be useful for you.