3

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

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

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

但是我如何获得那个 JWT 令牌。ClaimPrincipal 的第一个身份没有引导上下文。

4

2 回答 2

7

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

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters{SaveSigninToken=true},
                PostLogoutRedirectUri = postLogoutRedirectUri
            });
于 2015-04-20T18:25:41.783 回答
2

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

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

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

于 2015-04-20T17:08:05.807 回答