.net Core 3.0 和 OpenId Connect - 如何配置身份验证以验证 Azure 生成的非 JWT 访问令牌是否针对 Web API 中的 UserInfo?

.net Core 3.0 & OpenId Connect - How to configure authetication to validate Azure generated non JWT access token against UserInfo in a WebAPI?

因此,我们有一个 SPA,它调用位于 API 网关后面的一系列微服务。身份验证方案是针对 Azure AD 的 OpenId 流。因此,它是这样进行的:SPA(Public 客户端)获取访问代码,然后 API 网关(机密客户端)调用令牌服务以获取访问令牌;这就是它转发给微服务本身的内容。因此,最终,我们的微服务将仅接收非 JWT 访问令牌。请务必注意,此令牌不是 JWT。为了进行验证,我们被迫在 Azure 租户中使用 /openId/UserInfo 端点来检查具有访问令牌的用户。

我们已尝试在启动时使用 AddOpenIdConnect 扩展,如[此处] https://docs.microsoft.com/en-us/dotnet/architecture/microservices/secure-net-microservices-web-applications/

所述
{
    //…
    // Configure the pipeline to use authentication
    app.UseAuthentication();
    //…
    app.UseMvc();
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");
    var callBackUrl = Configuration.GetValue<string>("CallBackUrl");

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = identityUrl;
        options.SignedOutRedirectUri = callBackUrl;
        options.ClientSecret = "secret";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.RequireHttpsMetadata = false;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("orders");
        options.Scope.Add("basket");
        options.Scope.Add("marketing");
        options.Scope.Add("locations");
        options.Scope.Add("webshoppingagg");
        options.Scope.Add("orders.signalrhub");
    });
}

但这假定了整个 OpenId 流程。无论将 Bearer 令牌放在请求中,应用程序都会重定向到登录页面。

所以问题是,是否有任何开箱即用的配置?或者我们应该依赖一些自定义处理程序?在这种情况下,如何在上下文中正确验证用户?我们需要访问控制器本身中的 HttpContext.User.Claims。

如有任何提示,我们将不胜感激!

我可以问几个问题吗 - 部分是为了我自己的理解:

  • 是什么导致令牌不是 JWT - 我不认为你发布的 link 解释了这个?
  • 您是否使用某种形式的代币交换,从最初发行到 SPA 的代币?

我有一个有效的等效解决方案,但我使用的是免费开发者帐户,所以我的设置可能有所不同:

如果我了解如何重现您的设置 - 以及对配置差异的粗略了解 - 我可能会提供帮助。

使用用户信息端点来验证令牌感觉不对。以标准方式进行令牌验证会很好。