【发布时间】:2017-03-17 16:29:21
【问题描述】:
我正在尝试从基于站点的 Web 服务调用 Azure 托管 WebAPI。
基于站点的服务是一个 adal-angluar SPA,然后必须调用 Azure 中托管的 rest API。
来自 AAD 的不记名令牌已成功传递到基于站点的 Web API,然后必须代表用户获取新令牌才能调用下游 API,如以下示例所示:
https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof
示例中的下游 API 为 https://graph.windows.net。并将其作为 resourceId 传递给 AcquireTokenAsync 调用。
就我而言,下游 API 是我正在编写的 Azure 应用程序,因此我可以完全控制它。
我遇到的问题是“invalid_grant”是从我基于站点的 API 中的 AcquireTokenAsync 调用返回的,该 API 试图代表登录用户获取新令牌。
基于站点的 Web 应用在 Azure 中创建了一个 appid,并尝试获取新令牌,如下所示:
var appId = ConfigurationManager.AppSettings["ActiveDirectoryApplicationId"];
var appKey = ConfigurationManager.AppSettings["ActiveDirectoryApplicationKey"];
var aadInstance = ConfigurationManager.AppSettings["ActiveDirectoryInstance"];
var tenant = ConfigurationManager.AppSettings["ActiveDirectoryTenant"];
var onboardingResourceId = ConfigurationManager.AppSettings["OnboardingApplicationResourceId"];
var clientCredential = new ClientCredential(appId, appKey);
var bootstrapContext =
ClaimsPrincipal.Current.Identities.First().BootstrapContext as
System.IdentityModel.Tokens.BootstrapContext;
var userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
var userAccessToken = bootstrapContext.Token;
var userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
var authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, aadInstance, tenant);
var userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
var authContext = new AuthenticationContext(authority, new TokenCache());
var result = await authContext.AcquireTokenAsync(onboardingResourceId, clientCredential, userAssertion);
var accessToken = result.AccessToken;
return accessToken;
所以我的问题是,需要在 Azure 中实施什么安全措施才能获取令牌?我读到需要更新下游 API 的应用程序清单,以将基于站点的应用程序包含为“knownClientApplication”。对吗?
对于我的下游 Web api,我的 resourceId 应该是什么样的?
我可以在不将下游 Web Api 部署到 Azure 的情况下测试所有这些吗?我希望能够在本地调试所有这些,包括安全性。
谢谢。
【问题讨论】:
-
确保你的观众有一个斜杠 (
aud),就像https://onboardingResourceId.example.com/。
标签: azure asp.net-web-api adal