.net core AcquireTokenSilentAsync无法访问azure AD中注册的web api

.net core AcquireTokenSilentAsync无法访问azure AD中注册的web api,.net-core,azure-active-directory,.net Core,Azure Active Directory,我正在尝试获取在Azure AD中注册的web api的访问令牌。我正在从MVC操作方法调用AcquireTokenSilentAsync,如下所示 public async Task<IActionResult> GetWeatherReport() { string token = await GetAccessTokenForAPIAsync(); // some code }

我正在尝试获取在Azure AD中注册的web api的访问令牌。我正在从MVC操作方法调用AcquireTokenSilentAsync,如下所示

        public async Task<IActionResult> GetWeatherReport()
        {
            string token = await GetAccessTokenForAPIAsync();
            // some code
        }

 private async Task<string> GetAccessTokenForAPIAsync()
        {
            string authority = _authOptions.Authority;

            var cache = _tokenCacheFactory.CreateForUser(User);

            var authContext = new AuthenticationContext(authority,cache);

            string clientId = _authOptions.ClientId;
            string clientSecret = _authOptions.ClientSecret;
            var credential = new ClientCredential(clientId, clientSecret);
            var userId = User.GetObjectId();

            var result = await authContext.AcquireTokenSilentAsync(
                resourceId, // web api app id
                credential
                ,
                new UserIdentifier(userId, UserIdentifierType.UniqueId)
                );

            return result.AccessToken;
        }

但我想试试AcquireTokenSilentAsync。
我哪里做错了?如果您需要任何其他信息,请告诉我。

您无法使用
AcquireTokenSilentAsync
为用户获取全新的访问令牌。它用于获取带有缓存令牌的新令牌。实际上,缓存的刷新令牌将在流中使用

有关更多详细信息,请参阅:和


如果这不是根本原因,您可以在
return result.AccessToken,然后分析中的令牌以查看所有声明是否正确


更新

根据你的描述,我认为你可能想使用

您的MVC应用程序应该与图中的Web API A相同。您要调用的web API应该等于图中的web API B

如果是,您可以参考官方样本:

检查
私有静态异步任务callGraphHapionBehalfourUser()
方法。它遵循以下步骤:

1.从当前http上下文获取用户令牌
2.使用该令牌的构造函数用户断言
3.为目标Web API获取具有用户断言的新令牌。
4.使用新令牌调用Web API

我想这会符合你的要求。这样,用户只需登录到MVC应用程序。MVC应用程序本身将为目标API获取一个新的令牌

注意:管理员必须首先对Azure AD中的这些应用授予许可。您 你能在这里得到详细信息吗


您无法为具有
AcquireTokenSilentAsync
的用户获取全新的访问令牌。它用于获取带有缓存令牌的新令牌。实际上,缓存的刷新令牌将在流中使用

有关更多详细信息,请参阅:和


如果这不是根本原因,您可以在
return result.AccessToken,然后分析中的令牌以查看所有声明是否正确


更新

根据你的描述,我认为你可能想使用

您的MVC应用程序应该与图中的Web API A相同。您要调用的web API应该等于图中的web API B

如果是,您可以参考官方样本:

检查
私有静态异步任务callGraphHapionBehalfourUser()
方法。它遵循以下步骤:

1.从当前http上下文获取用户令牌
2.使用该令牌的构造函数用户断言
3.为目标Web API获取具有用户断言的新令牌。
4.使用新令牌调用Web API

我想这会符合你的要求。这样,用户只需登录到MVC应用程序。MVC应用程序本身将为目标API获取一个新的令牌

注意:管理员必须首先对Azure AD中的这些应用授予许可。您 你能在这里得到详细信息吗


尝试使用fiddler跟踪令牌请求的问题。我已经尝试了,但没有得到任何结果。它一直在调用GetWeatherReport操作方法和AcquireTokenSilentAsync。AcquireTokenSilentAsync正在引发异常,我们应该从AcquireTokenAsync获取令牌。尝试使用fiddler跟踪令牌请求的问题所在。我已经尝试过,但没有得到任何结果。它一直在调用GetWeatherReport操作方法和AcquireTokenSilentAsync。AcquireTokenSilentAsync正在引发异常,我们应该从AcquireTokenAsync获取令牌。感谢您的回答。AcquireTokenSilentAsync引发异常,由AcquireTokenAsync处理。但为什么会出现同步抛出错误??这些方法中有userassertion或usercredentials参数。它将用于用户级权限吗?例如,如果用户信息已传递,并且用户没有权限使用401进行azure ad响应?实际上,您发布的代码中没有足够的用户断言或凭据。只有一个用户ID。该用户ID将用于查找是否存在该用户的任何现有缓存令牌。如果有一个未过期,将直接返回。或者,如果刷新令牌未过期,它将使用刷新令牌获取新令牌,然后将其返回。如果不是上述两种情况,则会抛出异常,此时,您需要先使用
AcquireTokenAsync
获取令牌。找到一个满足您需求的模式。您可以查看我的更新。感谢您花时间解释这些步骤。我试试这个。谢谢你的回答。AcquireTokenSilentAsync引发异常,由AcquireTokenAsync处理。但为什么会出现同步抛出错误??这些方法中有userassertion或usercredentials参数。它将用于用户级权限吗?例如,如果用户信息已传递,并且用户没有权限使用401进行azure ad响应?实际上,您发布的代码中没有足够的用户断言或凭据。只有一个用户ID。该用户ID将用于查找是否存在该用户的任何现有缓存令牌。如果有一个未过期,将直接返回。或者,如果刷新令牌未过期,它将使用刷新令牌获取新令牌,然后将其返回。如果不是上述两种情况,则会抛出异常,此时,您需要先使用
AcquireTokenAsync
获取令牌。找到一个满足您需求的模式。您可以查看我的更新。感谢您花时间解释这些步骤。我要试试这个。
var result = await authContext.AcquireTokenAsync(
                resourceId,
                credential)