我有一个MVC应用程序,我在其中使用OpenIdConnectAuthenticationMiddleware
来针对AAD对用户进行身份验证。此MVC应用程序使用一些需要用户身份验证上下文的后端服务。
如果我在AAD中单独注册这些服务,我可以使用它来获取令牌
AuthenticationContext.AcquireTokenSilentAsync
。但是,使用AAD单独注册这些服务似乎是错误的,因为它们需要用户单独同意它们(它们实际上是应用程序的一部分)。
因此,当用户进行身份验证时,我想使用从AAD获得的JWT令牌,并将其用作承载令牌以调用下游服务。我意识到这些服务需要与MVC应用程序具有相同的受众。
但是如何获得JWT令牌呢? ClaimPrincipal的第一个标识没有引导上下文。
答案 0 :(得分:6)
请注意,让您的服务承认具有相同受众群体的令牌会让您受到令牌转发攻击。我不建议这样做。此外,同意应该在单个页面中进行并且只需单击一次 - 因此就用户影响而言,没有太大差异。
那就是说。如果您确实设置了它,则可以通过将标志SaveSignInToken
切换为true来强制在bootstrapcontext中存在令牌。参见
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters{SaveSigninToken=true},
PostLogoutRedirectUri = postLogoutRedirectUri
});
答案 1 :(得分:2)
编辑以下是实现此目的的一种方法,但它有一些安全隐患。您还可以设置一个标志来使用引导上下文。请参阅vibronet的答案以获取更多信息。
在OpenIdConnectAuthenticationOptions
中,如果您为SecurityTokenValidated
或AuthorizationCodeRecieved
通知配置处理程序,则可以访问通知属性中的id_token。然后,您可以在服务调用中将该id_token用作承载令牌。您可以通过几种不同的方式在控制器中使用id_token。
一个警告:id_token将使用您的Web应用程序的clientId作为aud声明,而不是app id uri。因此,在您的服务中,您应该使用clientId guid作为您的受众。