如何在 AAD 中获取下游服务的令牌

How to get a token for downstream service in AAD

我有一个 MVC 应用程序,我在其中使用 OpenIdConnectAuthenticationMiddleware 针对 AAD 对用户进行身份验证。此 MVC 应用程序使用一些需要用户身份验证上下文的后端服务。

如果我在 AAD 中单独注册这些服务,我可以使用 AuthenticationContext.AcquireTokenSilentAsync。但是使用 AAD 单独注册这些服务似乎是错误的,因为它们需要用户单独同意它们(它们实际上是应用程序的一部分)。

所以我想使用我在用户身份验证时从 AAD 获得的 JWT 令牌,并将其用作调用下游服务的承载令牌。我意识到这些服务需要与 MVC 应用程序具有相同的受众。

但我如何获得该 JWT 令牌。 ClaimPrincipal 的第一个身份没有 bootstrap 上下文。

编辑 下面是实现此目的的一种方法,但它有一些安全隐患。您还可以设置一个标志以使用 bootstrap 上下文。有关更多信息,请参阅 vibronet 的回答。

OpenIdConnectAuthenticationOptions 中,如果您为 SecurityTokenValidatedAuthorizationCodeRecieved 通知配置处理程序,则可以访问通知属性中的 id_token。然后,您可以在服务调用中使用该 id_token 作为不记名令牌。您可以通过多种不同的方式使 id_token 在您的控制器中可用。

一个警告:id_token 将您的网络应用程序的 clientId 作为 aud 声明,而不是应用程序 ID uri。所以在你的服务中,你应该使用 clientId guid 作为你的受众。

请注意,让您的服务接受具有相同受众的令牌会使您容易受到令牌转发攻击。我不建议这样做。此外,同意应该在单个页面中进行,并且只需单击一次——因此,就用户影响而言,并没有太大的区别。 就是说。如果你真的设置了它,你可以通过将标志 SaveSignInToken 切换为真来强制在引导上下文中存在令牌。参见

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters{SaveSigninToken=true},
                PostLogoutRedirectUri = postLogoutRedirectUri
            });