繁体   English   中英

Azure AD:从其他 .net Core Web API 调用 .net Core Web API

[英]Azure AD: Call .net Core Web API from other .net Core Web API

我有一种情况,我们使用 .net Core Web API 来管理一些“机器”。 公开的 API 之一是模拟此类机器的操作。 机器有不同的版本,每个不同的版本有不同的内部行为但相同的界面。

然后,我们开发了一系列不同的 .net Core Web API 来模拟每个不同版本的机器。

因此,我需要从 API 调用 API,这听起来很简单,因为我已经在使用Microsoft Graph这样做了。

在startup.cs中,我有:

public void ConfigureServices(IServiceCollection services)
{
    // To protect the API with Azure AD
    services
        .AddProtectedWebApi(Configuration);

    // To have ITokenAcquisition when calling the specific simulation API
    services
        .AddMicrosoftIdentityPlatformAuthentication(Configuration)
        .AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })
        .AddInMemoryTokenCaches();

我正在用 Postman 测试它,并考虑到这个流程:

  1. 我通过 Postman 获得了一个不记名令牌以访问通用 API
  2. Postman 在通用 API 中调用 SimulationDispatcherController
  3. SimulationDispatcherController 调用特定的模拟 API
  4. 结果流回邮递员

我正在经历的是:

  1. 如果我这样离开它,在邮递员中,我会得到一个登录页面

    <!-- Copyright (C) Microsoft Corporation. All rights reserved. --> <!DOCTYPE html> <html dir="ltr" class="" lang="en"> <head> <title>Sign in to your account</title> [...]
  2. 如果我删除.AddMicrosoftIdentityPlatformAuthentication(Configuration)那么我可以访问 SimulationDispatcherController 但是当它尝试调用其他 API 时,我收到错误消息:

     MSAL.NetCore.4.8.1.0.MsalUiRequiredException: ErrorCode: user_null Microsoft.Identity.Client.MsalUiRequiredException: No account or login hint was passed to the AcquireTokenSilent call. [...]

    我尝试使用ITokenAcquisition对象获取令牌,调用GetAccessTokenOnBehalfOfUserAsync(_Scopes); 其中范围是特定 API 所需的范围。

您是否有任何建议或指向文档的链接,以更好地解释如何在受 Azure AD 保护的 API 中配置 MSAL?

编辑:正如答案中所建议的,唯一需要的更改是:

.AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })

.AddProtectedApiCallsWebApis(Configuration)

似乎其他特定的模拟 API 也受 Azure AD 保护,您可以使用OAuth 2.0 On-Behalf-Of 流,该流程适用于应用程序调用服务/Web API 的场景,而后者又需要调用另一个服务/Web API。

是在带有 MSAL 2.3 及更高版本的 asp.net core web api 中使用 OBO 流的代码示例。

如果要从 Azure AD 投射的其他 .net Core Web API 调用 .net Core Web API,请使用OAuth 2.0 On-Behalf-Of 流 详细步骤如下

  1. 在客户端应用程序中登录用户
  2. 获取 Web API A 的令牌并调用它。
  3. 然后 Web API 调用另一个下游 Web API B(我使用 Microsoft Graph 进行测试)。

关于如何配置,请参考以下步骤:

注册 web api 应用程序

  1. 注册APP
  2. 创建客户端机密
  3. 配置访问另一个 web api 的权限 (我使用微软图表进行测试)
  4. 配置应用程序以公开 Web API (为 api 添加范围)

注册客户端应用程序

  1. 注册APP
  2. 创建客户端机密
  3. 配置访问 Web API 的权限

为 Web API 应用程序配置已知的客户端应用程序

  1. 在 Azure 门户中,导航到您的 Web api 应用注册并单击清单部分。

  2. 找到属性 knownClientApplications 并添加客户端应用程序的客户端 ID

配置项目

  1. 将引用Microsoft.Identity.Web添加到您的项目

  2. 在 appsettings.json 中添加以下代码

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "<your tenant id>",
    "ClientId": "<app id of Web API A>",
    "ClientSecret": "<app secret of Web API A>"
  },
  1. 在stratup.cs中添加以下代码
public void ConfigureServices(IServiceCollection services)
{
services.AddProtectedWebApi(Configuration)
                   .AddProtectedApiCallsWebApis(Configuration)
                   .AddInMemoryTokenCaches();
  1. 控制器
[Authorize]
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
              private readonly ITokenAcquisition _tokenAcquisition;
        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, ITokenAcquisition tokenAcquisition)
        {
            _logger = logger;
            _tokenAcquisition = tokenAcquisition;
        }



        [HttpGet]
        public async Task<string> Get()
        {

            string[] scopes = { "user.read" }; // the scope of Web API B
            string accessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(scopes);
            // you use the accessToken to call the Web API B
            GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        requestMessage.Headers.Authorization =
                            new AuthenticationHeaderValue("Bearer", accessToken);
                    }));

            User user =await client.Me.Request().GetAsync();
            return user.UserPrincipalName;
        }

     }

在邮递员中测试

  1. 获取 Web API A 的访问令牌在此处输入图片说明 在此处输入图片说明

  2. 调用 Web API A 然后让 Web API A 调用 Microsoft 图在此处输入图片说明

更多详细信息,请参阅文档示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM