C# Oauth令牌访问
我想获取访问令牌,以便使用它使用microsoft graph api从outlook获取电子邮件。我的应用程序将是基于控制台的c#应用程序,它将在每20分钟后自动运行,并将获取电子邮件 我不熟悉c#和microsoft graph,这是我与这些技术相关的第一项任务 问题是: 当我尝试使用客户端凭据获取令牌时,我成功地做到了这一点,但现在该令牌已过期,我希望获取新令牌,如果我尝试生成新令牌,它将仅返回过期的令牌 相关代码:C# Oauth令牌访问,c#,microsoft-graph-api,adal,C#,Microsoft Graph Api,Adal,我想获取访问令牌,以便使用它使用microsoft graph api从outlook获取电子邮件。我的应用程序将是基于控制台的c#应用程序,它将在每20分钟后自动运行,并将获取电子邮件 我不熟悉c#和microsoft graph,这是我与这些技术相关的第一项任务 问题是: 当我尝试使用客户端凭据获取令牌时,我成功地做到了这一点,但现在该令牌已过期,我希望获取新令牌,如果我尝试生成新令牌,它将仅返回过期的令牌 相关代码: result = await context.AcquireTokenA
result = await context.AcquireTokenAsync(resourceUri, clientCredential);
使用AcquireTokenSilentAsync方法返回为错误:
“无法以静默方式获取令牌,因为在缓存中找不到令牌。调用方法AcquireToken。”
相关代码:
result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
我的问题是:
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);
}
静态异步任务getAccessToken()
{
authContext=新的AuthenticationContext(“https://login.microsoftonline.com/");
尝试
{
结果=等待authContext.AcquireTokenSilentAsync(resourceUri,clientId);
}
捕获(例外情况除外)
{
控制台写入线(ex);
尝试
{
结果=等待authContext.AcquireTokenAsync(resourceUri,clientCredential);
Console.WriteLine(“+result.AccessToken+”\n\n”);
}
捕获(例外e)
{
Console.WriteLine(“\n AcquireTokenAsync失败\n”);
控制台写入线(“+e”);
}
}
如果(结果==null)
{
WriteLine(“取消获取访问令牌的尝试。\n”);
返回;
}
Console.WriteLine(result.AccessToken);
}
您混合了两种不同的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;
}
静态异步任务getAccessToken()
{
ClientCredential ClientCredential=新的客户端凭据(“您的应用程序ID”、“您的应用程序机密”);
AuthenticationContext authContext=新的AuthenticationContext(“https://login.microsoftonline.com/YOUR_TENANT_ID");
AuthenticationResult=null;
尝试
{
结果=等待authContext.AcquireTokenAsync(“https://graph.microsoft.com“,客户端凭据);
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
如果(结果==null)
WriteLine(“取消获取访问令牌的尝试”);
其他的
Console.WriteLine(result.AccessToken);
返回结果;
}
谢谢@Marc,我必须使用我的应用程序访问outlook mail,我认为“/v1.0/users/123e4567-e89b-12d3-a456-426655440000/mailFolders('Inbox')/messages”是我必须调用的API。对吗?以及如何获取用户ID?实际上,所有凭据都是由其他团队提供给我的,我没有访问Azure portal的权限。因此,我应该要求他们创建一个新用户并共享凭据,或者我可以使用代码来实现这一点。如果这个问题听起来真的很幼稚,我道歉!!使用客户端\u凭据时,没有用户。您正在验证您的“应用程序”本身,而不是“使用您的应用程序的用户”,因此我应该如何从这里开始,以及使用哪种API?之前我指的是你的回答[我不知道如何回答。这取决于你的应用程序和你想做什么。通常情况下,你会规划你的场景并确定你需要哪些API。你如何验证取决于你使用的API。