我想获取访问令牌,以使用它来使用Microsoft图形API从Outlook中获取电子邮件。我的应用程序将是基于控制台的c#应用程序,该应用程序将每20分钟自动运行一次并提取电子邮件。
我对c#和Microsoft graph都是陌生的,这是我与这些技术相关的第一项任务。
问题是:
当我尝试使用client_Credentials来获取令牌时,我能够成功完成此操作,但是现在令牌已过期,我想获取新令牌,如果我尝试生成新令牌,则仅返回已过期的令牌。
相关代码:
result = await context.AcquireTokenAsync(resourceUri, clientCredential);
使用AcquireTokenSilentAsync方法返回错误: “由于无法在缓存中找到令牌,因此无法以静默方式获取令牌。调用方法AcquireToken。”
相关代码:
result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
我的问题:
使用客户端凭据访问令牌是否可以满足我的需求?
我读到,使用client_Credentials不需要refresh_token,每次尝试连接时,我们都会获得新令牌。
每次我想连接时如何获取新令牌?
任何不提出疑问的关于如何实现我的主要目标的建议都将受到欢迎。
我要附加我的代码示例:
static async Task getAccessToken()
{
authContext = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
try
{
result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
}
catch (Exception ex)
{
Console.WriteLine(ex);
try
{
result = await authContext.AcquireTokenAsync(resourceUri, clientCredential);
Console.WriteLine("" + result.AccessToken+"\n\n");
}
catch (Exception e)
{
Console.WriteLine("\n AcquireTokenAsync failed\n");
Console.WriteLine(""+e);
}
}
if (result == null)
{
Console.WriteLine("Canceling attempt to get access token.\n");
return;
}
Console.WriteLine(result.AccessToken);
}
答案 0 :(得分:2)
您正在混合两种不同的OAuth流(授权代码和客户端凭据)。您只需要使用正确的凭据来调用AcquireTokenAsync
。每当您需要一个新令牌(每个令牌的寿命大约为一个小时)时,都可以重新执行此方法以获取一个新令牌:
static async Task<AuthenticationResult> getAccessToken()
{
ClientCredential clientCredential = new ClientCredential("YOUR_APP_ID", "YOUR_APP_SECRET");
AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/YOUR_TENANT_ID");
AuthenticationResult result = null;
try
{
result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
if (result == null)
Console.WriteLine("Canceling attempt to get access token.");
else
Console.WriteLine(result.AccessToken);
return result;
}