I want to get an access token from given URL:
https://login.microsoftonline.com/{AzureTenantId}/oauth2/v2.0/authorize
I am passing the following parameters, as mentioned in he Microsoft docs: client_id, scope, client_secret, grant_type, resource and audience.
When I hit this URL, I get a “403 Forbidden” response.
When I try the same from Bruno, it succeeds:
But not from my code:
public HttpStatusCode InvokeWebAPIPostJson(string apiBaseURL, string urlSuffix, SaveCommentModel saveCommentModel)
{
var token = WebAPIControllerExtensions.GetAuthenticationTokenAsync(this.configuration, ApplicationConstants.AUTHORITY_BASEURI, ApplicationConstants.GRANT_TYPE, ApplicationConstants.SCOPE, ApplicationConstants.CONTENT_TYPE);
double cltTimeout = ApplicationConstants.HTTPCLIENT_TIMEOUT;
var url = apiBaseURL ?? string.Empty;
using var httpRequestClient = new HttpClient();
httpRequestClient.Timeout = TimeSpan.FromMinutes(cltTimeout);
httpRequestClient.BaseAddress = new Uri(url);
httpRequestClient.DefaultRequestHeaders.Accept.Clear();
httpRequestClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpRequestClient.DefaultRequestHeaders.Add("Accept", "*/*");
httpRequestClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
string saveComment = JsonConvert.SerializeObject(saveCommentModel);
var stringvar = """ + saveComment + """;
StringContent jsonContent = new(saveComment, Encoding.UTF8, "application/json");
var resp = httpRequestClient.PostAsync($"{urlSuffix}", jsonContent).Result;
var statusCode = resp.StatusCode;
return statusCode;
}
// getting the token by using htis below method:
public static string GetAuthenticationTokenAsync(
IConfiguration configuration, string authBaseURL, string grantTypeStr
, string scopeStr, string contentType)
{
var audienceVal = configuration["Keyvault:Audience" + string.Empty] ?? string.Empty;
var clientIdVal = configuration["Keyvault:ClientId" + string.Empty] ?? string.Empty;
var secretVal = configuration["Keyvault:Secret" + string.Empty] ?? string.Empty;
var tenantVal = configuration["Keyvault:Tenant" + string.Empty] ?? string.Empty;
var audienceId = configuration.GetValue<string>(audienceVal) ?? string.Empty;
var client_id = configuration.GetValue<string>(clientIdVal) ?? string.Empty;
var client_secret = configuration.GetValue<string>(secretVal) ?? string.Empty;
var tenantId = configuration.GetValue<string>(tenantVal) ?? string.Empty;
string authorityUri = $"{authBaseURL}{tenantId}/oauth2/v2.0/authorize";
string grant_type = grantTypeStr;
string scope = $"{scopeStr}";
var list = new List<KeyValuePair<string, string>>();
var values = new Dictionary<string, string>()
{
{ "client_id", client_id },
{ "scope", $"{client_id}/.default" },
{ "client_secret", client_secret },
{ "grant_type", grant_type },
{ "resource", client_id },
{ "audience", audienceId }
};
list.AddRange(values);
var content = new FormUrlEncodedContent(list);
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(authorityUri),
Content = content
};
request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue(contentType) { CharSet = "UTF-8" };
var clt = new HttpClient();
var result = clt.PostAsync(authorityUri, content);
var resultContent = result.Result.Content;
var bearerData = resultContent.ReadAsStringAsync().Result;
var bearerToken = JObject.Parse(bearerData)["access_token"].ToString();
return bearerToken;
}
}
}
How to get / generate access token from azure OAuth 2.0 token (v2) endpoints?
User536 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
1
That is the endpoint to access (https://login.microsoftonline.com/{AzureTenantId}/oauth2/v2.0/token)
Assuming you have your Azure AD credentials stored in anappsettings.json
file. You should parsing your token correctly, those answer is parsing to access your token
update:
{
var token = WebAPIControllerExtensions.GetAuthenticationTokenAsync(this.configuration, ApplicationConstants.AUTHORITY_BASEURI, ApplicationConstants.GRANT_TYPE, ApplicationConstants.SCOPE, ApplicationConstants.CONTENT_TYPE);
double cltTimeout = ApplicationConstants.HTTPCLIENT_TIMEOUT;
var url = apiBaseURL ?? string.Empty;
using var httpRequestClient = new HttpClient();
httpRequestClient.Timeout = TimeSpan.FromMinutes(cltTimeout);
httpRequestClient.BaseAddress = new Uri(url);
httpRequestClient.DefaultRequestHeaders.Accept.Clear();
httpRequestClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpRequestClient.DefaultRequestHeaders.Add("Accept", "*/*");
httpRequestClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
string saveComment = JsonConvert.SerializeObject(saveCommentModel);
var stringvar = """ + saveComment + """;
StringContent jsonContent = new(saveComment, Encoding.UTF8, "application/json");
var resp = httpRequestClient.PostAsync($"{urlSuffix}", jsonContent).Result;
var statusCode = resp.StatusCode;
return statusCode;
}
// getting the token by using htis below method:
public static string GetAuthenticationTokenAsync(
IConfiguration configuration, string authBaseURL, string grantTypeStr, string scopeStr, string contentType)
{
var clientIdVal = configuration["Keyvault:ClientId"] ?? string.Empty;
var secretVal = configuration["Keyvault:Secret"] ?? string.Empty;
var tenantVal = configuration["Keyvault:Tenant"] ?? string.Empty;
var client_id = configuration.GetValue<string>(clientIdVal) ?? string.Empty;
var client_secret = configuration.GetValue<string>(secretVal) ?? string.Empty;
var tenantId = configuration.GetValue<string>(tenantVal) ?? string.Empty;
string authorityUri = $"{authBaseURL}{tenantId}/oauth2/v2.0/token";
string grant_type = grantTypeStr;
string scope = $"{client_id}/.default";
var values = new Dictionary<string, string>()
{
{ "client_id", client_id },
{ "scope", scope },
{ "client_secret", client_secret },
{ "grant_type", grant_type }
};
var content = new FormUrlEncodedContent(values);
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(authorityUri),
Content = content
};
request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue(contentType) { CharSet = "UTF-8" };
using var clt = new HttpClient();
var result = clt.PostAsync(authorityUri, content).Result;
var resultContent = result.Content.ReadAsStringAsync().Result;
var bearerToken = JObject.Parse(resultContent)["access_token"].ToString();
return bearerToken;
}```
joana is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
3