.net 如何为登录用户获取Microsoft Graph的访问令牌?
我正在开发一个.net Core 2 web应用程序,其Angular 5前端使用Azure AD进行身份验证 我们的图形实现基于aspnetcore connect示例。 我们在GraphAuthProvider.cs中有两个GetUserAccessTokenAsync方法的实现 我们可以获取应用程序的令牌,请参见下面的代码片段,但是下面为登录用户检索令牌的代码片段正在抛出ServiceException 显然,cca变量中的用户数组不包含任何用户,但我们无法找出原因。是否有在从角度前端调用的web api后端上使用Microsoft Graph的示例 由于额外的服务器端处理,我们需要通过web api进行调用,因此我们无法直接为这些调用调用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变量中的用户数组不包含任何用户,但我们无法找出原因。是否有在从角度前端
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。您确实可以将它们切换出去,例如,将另一个保留为空,但我会想到页面底部的这条评论。