【问题标题】:Oauth token accessingOauth 令牌访问
【发布时间】:2019-07-23 05:57:27
【问题描述】:

我想获取访问令牌以使用它来使用 Microsoft 图形 API 从 Outlook 获取电子邮件。我的应用程序将是基于控制台的 c# 应用程序,它将在每 20 分钟后自动运行并获取电子邮件。

我是 c# 和 microsoft graph 的新手,这是我与这些技术相关的第一个任务。

问题是:

当我尝试使用 client_Credentials 获取令牌时,我成功地这样做了,但是现在该令牌已过期,我想获取新令牌,如果我尝试生成新令牌,它只会返回过期的令牌。

相关代码:

result = await context.AcquireTokenAsync(resourceUri, clientCredential);

使用 AcquireTokenSilentAsync 方法返回错误: "在缓存中找不到令牌,无法静默获取令牌。调用方法 AcquireToken。"

相关代码:

result = await authContext.AcquireTokenSilentAsync(resourceUri, clientId);

我的问题:

  1. 使用客户端凭据访问令牌是满足我需求的正确方法吗?

  2. 我已经读过,使用 client_Credentials 我们不需要 refresh_token,每次我们尝试连接时都会获得新的令牌。

  3. 每次连接时如何获取新令牌?

  4. 非常欢迎任何关于如何实现我的主要目标的额外建议,而这些建议没有被问到。

我附上我的代码示例:

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);

}

【问题讨论】:

    标签: c# microsoft-graph-api adal


    【解决方案1】:

    您正在混合使用两种不同的 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;
    }
    

    【讨论】:

    • 谢谢@Marc,我必须使用我的应用程序访问 Outlook 邮件,我认为“/v1.0/users/123e4567-e89b-12d3-a456-426655440000/mailFolders('Inbox')/messages " 是我必须调用的 API。这是正确的吗?以及如何获取 UserID ?
    • 实际上所有凭据都是由其他团队提供给我的,我无权访问 Azure 门户。所以我应该要求他们创建一个新用户并共享凭证,或者我可以使用代码来做到这一点。如果问题听起来很幼稚,请道歉!
    • 使用 client_credentials 时 没有 没有用户。您正在验证您的“应用程序”本身,而不是“使用您的应用程序的用户”
    • 那么我应该如何从这里继续前进以及使用哪个 API?以前我指的是您的[stackoverflow.com/a/53125977/11134640]的这个答案
    • 我不知道该如何回答。这取决于您的应用程序以及您想要做什么。通常,您会规划您的场景并确定您需要哪些 API。您的身份验证方式取决于您使用的 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2018-02-17
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多