C# Oauth令牌访问

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

我想获取访问令牌,以便使用它使用microsoft graph api从outlook获取电子邮件。我的应用程序将是基于控制台的c#应用程序,它将在每20分钟后自动运行,并将获取电子邮件

我不熟悉c#和microsoft graph,这是我与这些技术相关的第一项任务

问题是:

当我尝试使用客户端凭据获取令牌时,我成功地做到了这一点,但现在该令牌已过期,我希望获取新令牌,如果我尝试生成新令牌,它将仅返回过期的令牌

相关代码:

result = await context.AcquireTokenAsync(resourceUri, clientCredential);
使用AcquireTokenSilentAsync方法返回为错误: “无法以静默方式获取令牌,因为在缓存中找不到令牌。调用方法AcquireToken。”

相关代码:

result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);
我的问题是:

  • 使用客户端凭据访问令牌是否是满足我需求的正确方法

  • 我已经读到,使用客户端\u凭据,我们不需要刷新\u令牌,每次尝试连接时,我们都将获得新令牌

  • 如何在每次连接时获取新令牌

  • 任何关于如何实现我的主要目标的额外建议,如果没有被问到,都将受到热烈欢迎

  • 我正在附上我的代码示例:

    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。