如何为我的Azure应用程序创建应用程序令牌?



所以我试图从"OAuth 2.0令牌端点(v2)"端点存在于我的Azure应用程序。就是这样。

[HttpGet("GetApplicationToken")]
public async Task<ActionResult> GetApplicationToken()
{
HttpClient client = new HttpClient();
var url = "https://login.microsoftonline.com/680ea9b1-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/v2.0/token";
var parameters = new Dictionary<string, string>
{
{"client_id", "41d391ef-xxxx-xxxx-xxxx-xxxxxxxxxxxx" },
{"scope", "api://41d391ef-xxxx-xxxx-xxxx-xxxxxxxxxxxx/access_as_user" },
{"client_secret", "PXa8Q~xx" },
{"grant_type", "client_credentials" }
};
var encodedContent = new FormUrlEncodedContent(parameters);
var response = await client.PostAsync(url, encodedContent);
if (response.IsSuccessStatusCode)
{
var responseStr = await response.Content.ReadAsStringAsync();
return Ok(JsonConvert.DeserializeObject<TokenResponse>(responseStr));
}
return StatusCode(500);

我得到的输出是:

{"type":"https://tools.ietf.org/html/rfc7231#section-6.6.1","title":"An error occurred while processing your request.","status":500,"traceId":"00-d0da4fd71ec21cb0f8b364e3853bda37-ed1dcd82609eef73-00"}

我希望这返回一个应用程序令牌,我的api可以使用,但我不知道问题可能是什么。谢谢!

scope参数应该是"api://41d391ef-xxxx-xxxx-xxxx-xxxxxxxxxxxx/.default"使用客户端凭证流时。这是因为你只能在应用注册中使用静态定义的权限,而不像用户参与的身份验证流可以动态地使用范围。

文档:https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow first-case-access-token-request-with-a-shared-secret .

引用scope参数的文档:

在此请求中传递的作用域参数的值应该是您想要的资源的资源标识符(应用程序ID URI),加上。default后缀。

(它也可以是客户端/应用程序ID,除了应用程序ID URI)

另外,不管是否成功状态码,读取响应内容也是一个好主意,这样您就可以检查返回的错误。此外,使用MSAL来实现此目的比手动调用api更容易。