.net core AcquireTokenSilentAsync无法访问azure AD中注册的web api
我正在尝试获取在Azure AD中注册的web api的访问令牌。我正在从MVC操作方法调用AcquireTokenSilentAsync,如下所示.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 }
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)