我正在尝试找到一种授权 Web 客户端的策略,该客户端对 Azure 中托管的两项服务进行 HTTP 调用。 Web 客户端都是客户端,两个 API 服务是托管在 Azure 中的 Azure Functions。
对于上述三个应用程序中的每一个,我都在 Azure AD 中设置了应用程序注册,并将两个 Azure Functions 应用程序的范围公开给 Web 客户端,以允许客户端调用它们。我还为两个 API 应用程序设置了应用程序角色,并将这些角色分配给用户。
当 Web 客户端对每个 API 服务进行单次调用时,当前设置效果非常好。但是,我希望 Web 客户端调用服务 A,然后服务 A 使用 Web 客户端用户的凭据对服务 B 进行 HTTP 调用。据我所知,当 Web 客户端调用服务 A 时,提供给 Web 客户端的令牌只有服务 A 的范围和角色,而没有服务 B 的任何内容。
我的问题是,允许将用户的凭据传递到内部服务的建议策略是什么?特别是当原始令牌没有额外服务的凭据时。
我确实发现了这个问题(使用托管标识在 Azure 中对应用程序服务进行身份验证),这非常接近我想要实现的目标。标记的答案似乎暗示我自己的应用程序负责为额外服务生成新令牌,但我不确定哪个应用程序负责这一点。是否建议 Web 客户端向服务 B 发出单独的请求以获取令牌,并在对服务 A 的 HTTP 请求中,在调用时将对服务 B 的令牌包含在请求正文中?
不久前,我遇到了这样的场景,我必须从前端获取后端 API 的用户令牌,然后在该 API 调用内的后端调用 Azure 管理 API。
我最终实现的解决方案是启用令牌获取以调用下游API,然后使用现有用户的令牌在后端API中获取令牌。
代码在我的Startup.cs
class:
services
.AddMicrosoftIdentityWebApiAuthentication(Configuration, "ApiSettings")
.EnableTokenAcquisitionToCallDownstreamApi()//This does the magic
.AddInMemoryTokenCaches();
在我的 API 控制器中,我必须注入ITokenAcquisition
使用类似的东西:
private readonly ITokenAcquisition _tokenAcquisition;
public MyController(ITokenAcquisition tokenAcquisition)
{
_tokenAcquisition = tokenAcquisition;
}
然后使用它来获取 Azure 管理 API 的令牌:
/// <summary>
/// Gets the access token on behalf of signed-in user to perform Azure
/// Resource Manager (ARM) API.
/// </summary>
/// <returns>
/// Access token.
/// </returns>
private async Task<string> GetAccessTokenForAzureSubscriptionManagementApiRequest()
{
IEnumerable<string> azureServiceManagementApiScopes = <scopes for Azure Management;
string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(azureServiceManagementApiScopes);
return accessToken;
}
您可以在这里了解更多信息:https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-call-api-app-configuration?tabs=aspnetcore.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)