ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-Oauth令牌访问

2019-12-11 03:08:44  阅读:622  来源: 互联网

标签:microsoft-graph adal c


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

我是C#和Microsoft图形的新手,这是我与这些技术相关的第一项任务.

问题是:

当我尝试使用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);

}

解决方法:

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

标签:microsoft-graph,adal,c
来源: https://codeday.me/bug/20191211/2105989.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有