Microsoft Graph - ASP.NET 核心 - 权限不足
Microsoft Graph - ASP.NET Core - Insufficient privileges
我有一个可用的 ASP.NET 核心多租户 ADAL 网络应用程序。我正在集成 Microsoft Graph,但是当我尝试在 Microsoft.Graph.GraphServiceClient
(例如 var me = await graphClient.Me.Request().GetAsync();
)上使用方法时,出现以下错误:
Authorization_RequestDenied: Insufficient privileges to complete the operation.
我能够正确获取访问令牌。如果我将令牌从运行时复制粘贴到 Postman,它工作正常:
但出于同样的原因,它会在 ASP.NET 核心中引发错误。
问题是,我在第一个成功的令牌之后第二次(严重地)请求令牌,而不是仅仅从 TokenCache 中读取它。
解决方法:
在登录时从授权代码获取令牌并将其存储在缓存中:
public async Task<AuthenticationResult> GetTokenByAuthorizationCodeAsync(string userId, string code)
{
TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache);
ClientCredential credential = new ClientCredential(_appId, _appSecret);
AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, new Uri(_redirectUri), credential, _graphResourceId);
return result;
}
catch (Exception)
{
return null;
}
}
并且在请求 GraphServiceClient
时,我刚刚从缓存中读取了正确的令牌:
public async Task<string> GetUserAccessTokenAsync(string userId)
{
TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache);
ClientCredential credential = new ClientCredential(_appId, _appSecret);
AuthenticationResult result = await authContext.AcquireTokenSilentAsync(_graphResourceId, credential, new UserIdentifier(userId, UserIdentifierType.UniqueId));
return result.AccessToken;
}
catch (Exception)
{
return null;
}
}
我有一个可用的 ASP.NET 核心多租户 ADAL 网络应用程序。我正在集成 Microsoft Graph,但是当我尝试在 Microsoft.Graph.GraphServiceClient
(例如 var me = await graphClient.Me.Request().GetAsync();
)上使用方法时,出现以下错误:
Authorization_RequestDenied: Insufficient privileges to complete the operation.
我能够正确获取访问令牌。如果我将令牌从运行时复制粘贴到 Postman,它工作正常:
但出于同样的原因,它会在 ASP.NET 核心中引发错误。
问题是,我在第一个成功的令牌之后第二次(严重地)请求令牌,而不是仅仅从 TokenCache 中读取它。
解决方法:
在登录时从授权代码获取令牌并将其存储在缓存中:
public async Task<AuthenticationResult> GetTokenByAuthorizationCodeAsync(string userId, string code)
{
TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache);
ClientCredential credential = new ClientCredential(_appId, _appSecret);
AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, new Uri(_redirectUri), credential, _graphResourceId);
return result;
}
catch (Exception)
{
return null;
}
}
并且在请求 GraphServiceClient
时,我刚刚从缓存中读取了正确的令牌:
public async Task<string> GetUserAccessTokenAsync(string userId)
{
TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache);
ClientCredential credential = new ClientCredential(_appId, _appSecret);
AuthenticationResult result = await authContext.AcquireTokenSilentAsync(_graphResourceId, credential, new UserIdentifier(userId, UserIdentifierType.UniqueId));
return result.AccessToken;
}
catch (Exception)
{
return null;
}
}