【问题标题】:How to get AD access token and pass it to web api controller?如何获取 AD 访问令牌并将其传递给 Web api 控制器?
【发布时间】:2020-07-11 02:34:52
【问题描述】:

如何从 login.microsoftonline.com 获取 AD 访问令牌并将访问令牌传递给 Web api 控制器? 因为我需要“访问令牌”来通过发布请求传递到另一个合作伙伴公司的网站网址。

下面的代码按预期进行 AAD 身份验证,但我也需要“访问令牌”,

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

        services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
        {
            options.Authority = options.Authority + "/v2.0/";


            options.TokenValidationParameters.ValidateIssuer = false;
        });

        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

【问题讨论】:

  • 据我了解,您需要AD访问令牌才能调用受AD保护的API,然后您的API将调用另一个受AD保护的应用程序。那正确吗?另外,能否请您告诉我您的 api 应用程序和合作伙伴公司网站在不同的租户中?
  • 是的,我的 api 应用程序和合作伙伴公司网站在不同的租户中。我的 API 将调用另一个受内部自定义身份验证提供程序 NOT AAD 保护的合作伙伴公司应用程序。合作伙伴公司应用会验证AAD访问令牌(我的应用提供)的签名段,以验证令牌的真实性,以便伙伴公司应用信任令牌以进一步进行。
  • 由于您只是使用 Azure AD 来投影您的 Web API,我认为您应该在 api 应用程序中验证令牌。为什么要使用公司应用程序来验证令牌。
  • 场景有点难以解释。我们可以聊天吗?
  • 对不起。我不能聊天。

标签: asp.net-core asp.net-web-api azure-active-directory access-token owin-middleware


【解决方案1】:

在原始帖子中附加的代码 sn-p 上面,没有暴露访问令牌,但在内部它设法获取访问令牌和验证,如何以更透明的方式做到这一点?

认证后即可获取token:

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
    options.Authority = options.Authority + "/v2.0/";         // Microsoft identity platform
    options.SaveTokens = true;
    options.TokenValidationParameters.ValidateIssuer = false; // accept several tenants (here simplified)
});

并在控制器中获取令牌:

var idToken = await HttpContext.GetTokenAsync("id_token"); 

但是使用您的代码 sn-ps 它不会返回访问令牌,因为您正在实施登录过程,而不是令牌请求。您应使用 ADAL/MSAL 获取访问令牌以访问受保护的 API。查看代码示例here

我在哪里获取访问令牌并使用自定义代码对其进行验证以便更好地理解。

您可以从herehere了解令牌签名的验证。

【讨论】:

  • 感谢您的理解和解决方案。现在我可以在控制器/动作中获取令牌,它用 [Authorize] 装饰并使用 AAD 公钥验证令牌,验证成功解决了我的问题。但是您上面的陈述“您的代码 sn-ps 它不会返回访问令牌,因为您正在实现登录过程,而不是令牌请求”,这与我上面代码的实时行为相矛盾。请澄清或让我错过任何需要考虑的事情。
  • 您的 OIDC 配置默认为 OIDC 登录流程,授权类型为 id_token ,您应该使用授权类型为代码的授权代码流程来获取访问令牌:docs.microsoft.com/en-us/azure/active-directory/develop/…
  • [Authorize] 控制器顶部的属性,如果提供 id_token 而不是访问令牌,不会抱怨?任何通过授权代码流以透明方式获取访问令牌的 c# 示例?最终用户通过 FIDO2 流进行身份验证后是否有可能获得访问令牌?
  • [Authorize] 将检查用户的身份,这与 id_token 有关,因为来自 id_token 的声明将填充用户的原则,你想如何获得令牌?检查上面评论中的代码示例。
  • 你想如何获取token?我想在 FIDO 身份验证后(或)在用户名和密码验证后从 AAD 获取令牌。同样在控制器内部,我需要该 AAD 访问令牌的副本以满足某些业务需求。而已!上面提供的代码示例不是用户友好的方式。
【解决方案2】:

您好,请下载并按照示例中提供的说明进行操作。它帮助您首先设置 Web Api,并提供一个客户端应用程序,该应用程序首先登录用户,然后获取 Web Api 的访问令牌

How to secure a Web API built with ASP.NET Core

一旦您可以让示例工作,您可以将示例的 Web Api 替换为您合作伙伴的 Web Api。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2019-03-25
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2019-11-21
    • 2019-12-31
    相关资源
    最近更新 更多