获取服务主体对象访问令牌的正确方法是什么



我有一个API,它在Azure AD中注册为服务主体。我正在尝试从客户端应用程序获取访问令牌,并将其传递给API。

作为HttpClient请求的一部分,我添加了以下代码(来自Microsoft文档(:

var accessToken = await tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);

这是有效的,但它只会工作24小时,此时我必须重新启动应用程序服务才能再次工作。我猜这是因为令牌已经过期,并且没有检索到新的令牌。

我在某个地方读到,如果使用上面的代码,则需要手动处理令牌的过期和缓存。

我应该如何使用Azure.Identity检索这些令牌?

这是服务寿命问题,也是HttpClient的一个不可靠的实现。切换到IHttpClientFactory后,问题现在似乎得到了解决。

根据您的代码片段,您似乎正在使用客户端凭据流来生成访问令牌(您将范围设置为xx/.default(,所以我认为您可以添加Azure.Identity包并使用下面的代码来生成访问标记。在您想要调用api之前,只需调用此方法来生成令牌。代码示例摘录自此处。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using WebApplication1.Models;
using Microsoft.Identity.Client;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public async Task<string> gettokenAsync() {
IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.Create("azure_ad_app_client_id_here")
.WithClientSecret("client_secret_here")
.WithAuthority(new Uri("https://login.microsoftonline.com/tenant_name.onmicrosoft.com"))
.Build();
AuthenticationResult result = null;
//e.g.  https://graph.microsoft.com/.default
string[] scopes = new string[] { "xxxx/.default" };
result = await app.AcquireTokenForClient(scopes)
.ExecuteAsync();
string accesstoken = result.AccessToken;
return accesstoken;
}
}
}

相关内容

最新更新