【发布时间】:2018-08-20 02:53:49
【问题描述】:
尝试使用 AcquireTokenAsync 代表 AAD 用户获取 本机 应用程序的令牌时出现上述 ADAL 错误。
场景: Angular 单页应用程序正在使用 adal.js 库为用户获取访问令牌。 此令牌被传递到本质上是相同应用程序的自托管 Web api(通过 adal.js 进行的初始登录和自托管 Web api 都使用相同的 Azure App Id)。 webapi 尝试代表用户获取一个新令牌,以使用 AcquireTokenAsync 调用另一个 Azure 托管的 web api。
代码:
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(userAccessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
var authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, _aadInstance, _tenant);
var authContext = new AuthenticationContext(authority, new TokenCache());
var result = await authContext.AcquireTokenAsync(_resourceUri, _appId, userAssertion);
var accessToken = result.AccessToken;
return accessToken;
请注意,Azure 中的应用注册是没有应用密钥的本机应用。如果我将应用程序创建为 webapi 应用程序并在 ClientCredential 对象中使用 appid 和密钥,则会按预期返回令牌。
var clientCredential = new ClientCredential(_appId, _appKey);
...
var result = await authContext.AcquireTokenAsync(_resourceUri, clientCredential, userAssertion);
我无法让它与本机应用程序一起使用。有什么建议?或者任何想法为什么我会收到无效令牌错误?
理由: 我需要使用本机应用程序而不是 webapi 应用程序注册的原因是,客户端(角度 SPA 应用程序 + 自托管 webapi)部署在现场而不是 Web 服务器上。我不想使用应用程序密钥部署应用程序,因为应用程序密钥过期并且在过期时使用新密钥重新部署客户端应用程序不是一个好的选择。使用没有密钥的本机应用程序将避免这样做。
谢谢。
【问题讨论】:
-
是否可以绕过第一个 API 的 AcquireTokenAsync 调用来获取新的令牌来调用第二个 API? IE。在从 adal.js 首次登录时,用户被授予调用下游 API 的令牌?
标签: oauth-2.0 asp.net-web-api2 jwt access-token adal