对多个后端服务的 Azure AD 用户进行身份验证

2023-12-12

我正在尝试找到一种授权 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(使用前将#替换为@)

对多个后端服务的 Azure AD 用户进行身份验证 的相关文章

随机推荐

  • 无法使用沙盒帐户

    我真的需要你们的帮助 两个小时以来 我遇到了一个与 Paypal Sandbox 相关的非常奇怪的问题 我在堆栈溢出上阅读了很多答案 但没有一个对我有帮助 我将尝试解释我的问题 当我创建一个新的沙箱帐户 尊重密码强度 负载平衡等所有规则 时
  • 序列化数组以将它们存储在数据库中的意义是什么?

    我看到人们存储数组的方式如下 a 6 i 0 s 5 11148 i 1 s 5 11149 i 2 s 5 11150 i 3 s 5 11153 i 4 s 5 11152 i 5 s 5 11160 为什么他们不能是 11148 11
  • Cython 中数组的总和

    我正在尝试找到使用 Cython 水平求和 numpy 数组数组的最快方法 首先 假设我有一个随机浮点数 10 x 100 000 的二维数组 我可以创建一个object数组 每一列作为数组中的值 如下所示 n 10 5 a np rand
  • 如果名称变量以下划线为前缀,则 Bean 验证不起作用

    我正在尝试一些 bean 验证 但我偶然发现了 奇怪 的行为 我正在使用 Glassfish 和 Primefaces 作为前端 如果有什么区别的话 在我的项目的其他地方 我使用 Hibernate validator 我不确定它是否正在验
  • 垃圾收集器 C#,有关“清除”对象的问题

    我阅读了一些有关垃圾收集的信息 它是如何工作的等 我尝试通过我的示例了解它是如何工作的 但我认为我有问题 我知道垃圾收集器在以下情况下运行 内存不够 你调用GC Collect 这是我的代码 public partial class For
  • 为什么 trySend 会发出假数据?

    我需要在 MVVM 中获取用户身份验证状态 在存储库中我这样做 override fun getAuthResponse callbackFlow val listener AuthStateListener Log d TAG curre
  • 在数据库中保存塞尔维亚拉丁字符

    我在数据库中保存塞尔维亚拉丁字符时遇到问题 但只有当我从 jsf 应用程序保存它时才会出现问题 当我直接使用 SQLyog 在数据库中插入一些行时 一切都很好 当我尝试从应用程序插入某些内容而不是字符时 and 在数据库中插入问号 另一方面
  • jqgrid服务器异常错误消息

    有没有办法在我的 jqGrid 中显示从服务器发送的自定义异常消息 我的一个函数执行 throws 子句并抛出一些异常 我需要显示与此抛出的异常相关的错误消息 有没有办法在 jqGrid 中做到这一点 您没有指定在哪个 jqGrid 操作中
  • START_STICKY 和 START_NOT_STICKY

    有什么区别START STICKY and START NOT STICKY在android中实现服务时 谁能指出一些标准示例 这两个代码仅在手机内存不足并在服务完成执行之前终止服务时才相关 START STICKY告诉操作系统在有足够的内
  • 在scala中序列化优先级队列

    我正在尝试序列化一个可变的PriorityQueue在 scala 2 10 中 我得到了NotSerializableException将对象写入 ObjectOutputStream 时 我做了一个简单的测试用例 import java
  • 如何在 Zend Framework 2 中访问路由、发布、获取等参数

    zf2中如何获取与页面请求相关的各种参数 像 post get 参数 正在访问的路由 发送的标头和上传的文件 最简单的方法是使用参数插件 在 beta5 中引入 它具有实用方法 可以轻松访问不同类型的参数 一如既往 读书测试对于理解某物应该
  • 我应该使用事件、信号量、锁、条件或其组合来管理安全退出多线程 Python 程序吗?

    我正在编写一个多线程Python程序 其中主线程和它生成的其他线程作为守护进程运行 但不是Thread daemon True 它们在某些目录中查找某些文件 并在它们存在时对其执行操作 一个 任何线程中可能会发生错误 这将需要整个程序退出
  • 如何使用 MASM 在控制台上进行输入/输出? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我用谷歌搜索了又搜索 但没有发现任何有用的东西 如何将输出发送到控制台 并通过程序集接受来自控制台的用户输入 我正在使用 MASM32 正如 filofel 所说 使用 Win3
  • 比较在 Three.js 中创建天空盒材质的方法

    当谈到在 Three js 中制作天空盒时 我看到了两种不同的思想流派 假设我们有代码 var imagePrefix images mountains var directions xpos xneg ypos yneg zpos zne
  • 反应改变数组中的状态(for循环)

    我有一个有航班的州 并且有一个滑块可以更改最高价格以更改航班元素的可见性 maxpriceFilter var flightOffer this state flightOffer var sliderPrice this state sl
  • 如何在 C++ 中将加载到内存中的图像文件转换为 ID2D1Bitmap

    我正在尝试将刚刚从压缩文件提取到内存中的图像文件 png 但可以是任何东西 转换为 ID2D1Bitmap 以便使用 Direct 2D 进行绘制 我试图寻找一些文档 但我只能找到接收 const char path 或询问我图像的宽度和高
  • 解析 URI 参数和关键字值对

    我想解析文本文件中 URI L 的参数和关键字值 还应包括没有值的参数 Python 很好 但我愿意接受使用其他工具的建议 例如 Perl 或单行代码也可以解决这个问题 示例来源 www domain com folder page php
  • 使用 VB .Net 和 UI Automation 从 Google Chrome 中所有打开的选项卡获取 url

    您好 我有这段代码可以获取 Chrome 上的当前 url 但只能获取活动选项卡 url 我需要使用 UI 自动化从所有打开的选项卡获取 url 我的工作代码 Function GetChromeUrl ByVal proc As Proc
  • R 文本挖掘 - 处理复数

    我正在学习 R 中的文本挖掘 并且取得了相当大的成功 但我对如何处理复数感到困惑 即我希望 nation 和 nations 被算作同一个词 理想情况下 dictionary 和 dictionaries 被算作同一个词 x lt nati
  • 对多个后端服务的 Azure AD 用户进行身份验证

    我正在尝试找到一种授权 Web 客户端的策略 该客户端对 Azure 中托管的两项服务进行 HTTP 调用 Web 客户端都是客户端 两个 API 服务是托管在 Azure 中的 Azure Functions 对于上述三个应用程序中的每一