首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AcquireTokenAsync返回"invalid_grant“、"AADSTS65001”

AcquireTokenAsync返回"invalid_grant“、"AADSTS65001”
EN

Stack Overflow用户
提问于 2017-03-14 06:35:12
回答 2查看 1.1K关注 0票数 1

我试图从基于站点的WebAPI中调用Azure托管的WebService。基于站点的服务是一个,它必须调用位于Azure中的rest。来自AAD的承载令牌成功地传递给基于站点的web API,然后必须代表用户获得一个新的令牌来调用下游API,如下例所示:

https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

示例中的下游API是https://graph.windows.net。这将作为resourceId传递到resourceId调用中。

在我的例子中,下游API是我正在编写的Azure应用程序,所以我可以完全控制它。

我遇到的问题是“invalid_grant”是从我的基于站点的api中的AcquireTokenAsync调用返回的,该api试图代表登录用户获得一个新的令牌。

基于站点的web应用程序在Azure中创建了一个appid,并试图获得以下新令牌:

代码语言:javascript
复制
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,我的resourceId应该是什么样的呢?

我可以测试所有这些而不将我的下游Web部署到Azure吗?我希望能够在本地调试所有这些,包括安全性。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-17 08:29:21

若要授予自定义应用程序权限以代表用户调用另一个应用程序,您需要遵循以下步骤:

  1. 在旧门户中查找自定义应用程序并打开配置页。
  2. 单击屏幕底部的Add应用程序。
  3. 选择所有的应用程序搜索你想要访问的应用程序名称,然后点击勾选添加。
  4. 在应用程序的“权限”部分中选择“委托权限”。
  5. 单击保存。
票数 0
EN

Stack Overflow用户

发布于 2017-03-14 07:17:26

knownClientApplications数组包含应用程序的客户机ids,这些应用程序是众所周知的客户端。这意味着当用户首先同意您的前端应用程序时,除了前端应用程序的要求之外,它还将显示API的权限要求。您不需要单独同意API,这通常是不需要的。这样,他们就会得到同意,并立即获得许可。

您可以在Azure门户中找到的资源id。只需为您的API找到应用程序,转到Properties,并找到app:

通常,App (或资源URI)的形式是https://your-domain-name.com/AppName。对于多租户应用程序来说,重要的一点是URI中的域必须是Azure AD中的验证域。

是的,您可以在本地环境中测试所有的东西。只要您将应答URL指定为localhost等,您就应该可以选择。

很抱歉,我不太清楚你为什么会有一个无效的授权错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42779211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档