gpt4 book ai didi

azure - AcquireTokenAsync 返回 "invalid_grant"、 "AADSTS65001"

转载 作者:行者123 更新时间:2023-12-03 04:26:26 25 4
gpt4 key购买 nike

我正在尝试从基于站点的 WebService 调用 Azure 托管 WebAPI。基于站点的服务是 adal-angluar SPA,然后必须调用 Azure 中托管的 REST API。来自 AAD 的不记名 token 已成功传递到基于站点的 Web API,然后必须代表用户获取新 token 才能调用下游 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 试图代表登录用户获取新 token 。

基于站点的 Web 应用程序在 Azure 中创建了一个 appid,并尝试获取新 token ,如下所示:

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 中实现哪些安全措施才能获取 token ?我读到下游 API 的应用程序 list 需要更新,以将基于站点的应用程序包含为“knownClientApplication”。这是正确的吗?

我的下游 Web API 的 ResourceId 应该是什么样子?

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

谢谢。

最佳答案

knownClientApplications 数组包含众所周知的客户端应用程序的客户端 ID。这意味着当用户第一次同意你的前端应用程序时,除了前端应用程序的要求之外,它还会显示API的权限要求。您无需单独同意 API,这通常是不需要的。这样他们就会立即获得同意并获得权限。

您可以在 Azure 门户中找到的资源 ID。只需找到适用于您的 API 的应用程序,转到“属性”,然后找到应用程序 ID URI:

Azure AD App Properties

通常,应用程序 ID URI(或资源 URI)的格式为 https://your-domain-name.com/AppName 。对于 Multi-Tenancy 应用程序来说,重要的一点是 URI 中的域必须是 Azure AD 中经过验证的域。

是的,您可以在本地环境中测试所有内容。只要您将回复 URL 指定为 localhost 等,就可以开始了。

抱歉,我不太确定您为什么会收到无效授权错误。

关于azure - AcquireTokenAsync 返回 "invalid_grant"、 "AADSTS65001",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42779211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com