.net 如何为登录用户获取Microsoft Graph的访问令牌?

.net 如何为登录用户获取Microsoft Graph的访问令牌?,.net,angular,asp.net-core,microsoft-graph-api,.net,Angular,Asp.net Core,Microsoft Graph Api,我正在开发一个.net Core 2 web应用程序,其Angular 5前端使用Azure AD进行身份验证 我们的图形实现基于aspnetcore connect示例。 我们在GraphAuthProvider.cs中有两个GetUserAccessTokenAsync方法的实现 我们可以获取应用程序的令牌,请参见下面的代码片段,但是下面为登录用户检索令牌的代码片段正在抛出ServiceException 显然,cca变量中的用户数组不包含任何用户,但我们无法找出原因。是否有在从角度前端

我正在开发一个.net Core 2 web应用程序,其Angular 5前端使用Azure AD进行身份验证

我们的图形实现基于aspnetcore connect示例。

我们在GraphAuthProvider.cs中有两个GetUserAccessTokenAsync方法的实现

我们可以获取应用程序的令牌,请参见下面的代码片段,但是下面为登录用户检索令牌的代码片段正在抛出ServiceException

显然,cca变量中的用户数组不包含任何用户,但我们无法找出原因。是否有在从角度前端调用的web api后端上使用Microsoft Graph的示例

由于额外的服务器端处理,我们需要通过web api进行调用,因此我们无法直接为这些调用调用Graph

代表登录用户获取图形访问令牌

 public async Task<string> GetUserAccessTokenAsync(string userId)
    {
        _userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();

        var cca = new ConfidentialClientApplication(
            _clientId,
            _redirectUri,
            _credential,
            _userTokenCache,
            null);

        if (!cca.Users.Any()) throw new ServiceException(new Error
        {
            Code = "TokenNotFound",
            Message = "User not found in token cache. Maybe the server was restarted."
        });

        try
        {
            var result = await cca.AcquireTokenSilentAsync(_scopes, cca.Users.First());
            return result.AccessToken;
        }

        // Unable to retrieve the access token silently.
        catch (Exception)
        {
            throw new ServiceException(new Error
            {
                Code = GraphErrorCode.AuthenticationFailure.ToString(),
                Message = "Caller needs to authenticate. Unable to retrieve the access token silently."
            });
        }
    }
公共异步任务GetUserAccessTokenAsync(字符串用户ID) { _userTokenCache=new SessionTokenCache(userId,_memoryCache).GetCacheInstance(); var cca=新的机密客户端应用程序( _clientId, _乌里, _证书, _userTokenCache, 无效); 如果(!cca.Users.Any())引发新的ServiceException(新错误 { Code=“TokenNotFound”, Message=“在令牌缓存中找不到用户。可能服务器已重新启动。” }); 尝试 { var result=wait cca.AcquireTokenSilentAsync(_scopes,cca.Users.First()); 返回result.AccessToken; } //无法以静默方式检索访问令牌。 捕获(例外) { 抛出新ServiceException(新错误 { Code=GraphErrorCode.AuthenticationFailure.ToString(), Message=“呼叫方需要进行身份验证。无法以静默方式检索访问令牌。” }); } } 获取应用程序图访问令牌

 public async Task<string> GetClientAccessTokenAsync()
    {
        _appTokenCache = new SessionTokenCache(_clientId, _memoryCache).GetCacheInstance();

        var cca = new ConfidentialClientApplication(
            _clientId,
            _clientAuthority,
            _redirectUri,
            _credential,
            null,
            _appTokenCache);


        try
        {
            var result = await cca.AcquireTokenForClientAsync(_appScopes);
            return result.AccessToken;
        }
        catch (Exception)
        {
            throw new ServiceException(new Error
            {
                Code = GraphErrorCode.AuthenticationFailure.ToString(),
                Message = "Unable to authenticate. Unable to retrieve the access token for client."
            });
        }
    }
}
公共异步任务GetClientAccessTokenAsync() { _appTokenCache=new SessionTokenCache(_clientId,_memoryCache).GetCacheInstance(); var cca=新的机密客户端应用程序( _clientId, _客户授权, _乌里, _证书, 无效的 _appTokenCache); 尝试 { var结果=等待cca.AcquireTokenForClientSync(_appScopes); 返回result.AccessToken; } 捕获(例外) { 抛出新ServiceException(新错误 { Code=GraphErrorCode.AuthenticationFailure.ToString(), Message=“无法进行身份验证。无法检索客户端的访问令牌。” }); } } }
您可能希望在该项目的回购协议中发布此信息。他们似乎对示例中的问题做出了非常积极的回应:可能有点晚了,但似乎您正在使用SessionTokenCache来处理您的用户令牌和AppToken。您确实可以将它们切换出去,例如,将另一个保留为空,但我会想到页面底部的这条评论。