【发布时间】:2018-07-03 17:08:11
【问题描述】:
我有一个使用 Azure AD 身份验证的应用程序。我还需要访问 Microsoft Graph API 以获取用户数据。我发现向 Graph API 发出请求的每个示例都使用缓存的会话令牌,但由于我使用的是 JWT,显然我不需要存储会话状态。如何使用以我的应用为受众的 JWT 获得合适受众的 JWT?
例如,这是一个从Microsoft Graph AspNetCore Sample 检索令牌的请求:
_userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
var cca = new ConfidentialClientApplication(
_appId,
_redirectUri,
_credential,
_userTokenCache,
null);
var result = await cca.AcquireTokenSilentAsync(_scopes, cca.Users.First());
return result.AccessToken;
它利用内存缓存从带有 OpenId Connect cookie 的 Challenge() 重定向登录中提取令牌。但是,由于我使用的是 JWT,我已经有了不记名令牌,但是权限错误。我需要做什么才能获得可用于访问 Graph API 的新令牌?我仍然希望为我的应用程序 ID 授权令牌,因此我需要一个新令牌,允许我通过服务器端休息请求访问 API。
编辑:错误地标记为 Azure AD Graph,重新标记为 Microsoft Graph。
编辑编辑:澄清一下,到目前为止我看到的每个示例都使用会话 cookie:
services.AddAuthentication(sharedOptions => {
sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
但是,我使用的是 JWT,所以我没有缓存令牌:
app.UseJwtBearerAuthentication(new JwtBearerOptions {
Authority = $"{instance}{tenant}",
Audience = audience,
SaveToken = true
});
我从对login.microsoftonline.com 的请求中获得的 JWT 将我的应用程序作为受众,而这些示例生成的 JWT 将 https://graph.microsoft.com 作为受众。所以我需要(我认为至少)只使用我从标准身份验证请求中获得的令牌来为这个观众获取一个令牌。
【问题讨论】:
-
您能解释一下“我正在使用 JWT”是什么意思吗? JWT 只是令牌格式,您可以从任何 AAD OAUTH 方法中获得。
-
应用程序发布到 login.microsoftonline.com,我从该服务获得 JWT。所描述的示例似乎都在使用会话 cookie,因此只需调用 app.AddMemoryCache() 即可使用实时令牌填充它们的内存缓存。我得到的令牌是针对不同的受众的,因此被图形 api 拒绝。
-
@MarcLaFleur 我已经更新了帖子,提供了有关应用程序身份验证方案的更多信息。