Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用刷新令牌通过c#从Office 365读取电子邮件_C#_Outlook_Oauth 2.0_Office365_Outlook Restapi - Fatal编程技术网

使用刷新令牌通过c#从Office 365读取电子邮件

使用刷新令牌通过c#从Office 365读取电子邮件,c#,outlook,oauth-2.0,office365,outlook-restapi,C#,Outlook,Oauth 2.0,Office365,Outlook Restapi,所以我可以通过OAuth2登录Outlook,让它为我的应用程序提供访问和刷新令牌 但是,我似乎不知道如何让OutlookOAuth2使用提供的刷新令牌为我提供另一个令牌。我曾多次尝试使用C#HttpClient()使某些东西正常工作,但都弄乱了这段代码。此外,我还尝试遵循并使用“本机”的“实验性.IdentityModel.Clients.ActiveDirectory”库(这到底是什么?)来完成我的任务 我可以使用这个库登录并获得访问代码,但它不会给我刷新令牌。这个特定的库似乎不提供对刷新令

所以我可以通过OAuth2登录Outlook,让它为我的应用程序提供访问和刷新令牌

但是,我似乎不知道如何让OutlookOAuth2使用提供的刷新令牌为我提供另一个令牌。我曾多次尝试使用C#HttpClient()使某些东西正常工作,但都弄乱了这段代码。此外,我还尝试遵循并使用“本机”的“实验性.IdentityModel.Clients.ActiveDirectory”库(这到底是什么?)来完成我的任务

我可以使用这个库登录并获得访问代码,但它不会给我刷新令牌。这个特定的库似乎不提供对刷新令牌的访问,即使它们是在响应中提供的

总之,下面是我用来获取访问令牌的HttpClient代码(这是从我的回调控制器方法得到的):

string authCode=Request.Params[“code”];
var client=新的HttpClient();
var clientId=ConfigurationManager.AppSettings[“ida:clientId”];
var clientSecret=ConfigurationManager.AppSettings[“ida:clientSecret”];
var参数=新字典
{
{“client_id”,clientId},
{“客户机密”,clientSecret},
{“代码”,authCode},
{“redirect_uri”,Url.Action(“Authorize”,“Manage”,null,Request.Url.Scheme)},
{“授权类型”、“授权代码”}
};
var content=new FormUrlEncodedContent(参数);
var response=wait client.PostAsync(“https://login.microsoftonline.com/common/oauth2/v2.0/token“,内容);
var tokens=wait response.Content.ReadAsAsync();
var originalRefreshToken=tokens.refresh\u token;
var originalAccessToken=tokens.access\u token;
originalAccessToken按预期生成。现在有一部分我搞不清楚:

var parameters2 = new Dictionary<string, string>
   {
      {"grant_type", "refresh_token"},
      {"refresh_token", originalRefreshToken},
      {"client_id", clientId},
      {"client_secret", clientSecret},
      {"resource","https://outlook.office365.com" }
   };
var content2 = new FormUrlEncodedContent(parameters2);
var response2 = await client.PostAsync("https://login.microsoftonline.com/common/oauth2/token", content2);
var tokens2 = await response2.Content.ReadAsAsync<MicrosoftOAuthAuthenticationModel>();
var newRefreshtoken = tokens2.refresh_token;
var newAccessToken = tokens2.access_token;
var参数s2=新字典
{
{“授权类型”,“刷新令牌”},
{“刷新令牌”,原始刷新令牌},
{“client_id”,clientId},
{“客户机密”,clientSecret},
{“资源”https://outlook.office365.com" }
};
var content2=新的FormUrlEncodedContent(参数2);
var response2=等待客户端。PostAsync(“https://login.microsoftonline.com/common/oauth2/token“,内容2);
var tokens2=wait response2.Content.ReadAsAsync();
var newRefreshtoken=tokens2.refresh\u token;
var newAccessToken=tokens2.access\u token;
我从服务器收到一个400错误,上面写着“身份验证失败:刷新令牌格式错误或无效”。这看起来很奇怪,因为我从响应中抓取刷新令牌并使用它


有没有人能提供一些有用的信息?或者,有人知道要联系谁寻求帮助吗?最后,这里的目标是能够通过API持续读取office 365收件箱中的电子邮件,这样我就可以从电子邮件地址获取电子邮件id、对话id、主题、内容等并对其进行处理。有没有更简单的方法?这不会是一件困难或不寻常的事情。

如果您使用的是ADAL库(
Experimental.IdentityModel.Clients.ActiveDirectory
),则无需保存刷新令牌。库保存令牌并根据需要为您管理刷新。您只需始终使用
AcquireSilent…
(不记得确切的方法名称)检索令牌,它将尽可能从缓存中提取,并在需要时刷新


在您的代码中,您可能会看到这个问题,因为在刷新中您没有发布到v2端点。将端点URL更改为
https://login.microsoftonline.com/common/oauth2/v2.0/token
,看看这是否解决不了问题。如果它仍然不起作用,您可以与比较。

如果您使用的是ADAL库(
Experimental.IdentityModel.Clients.ActiveDirectory
),则无需保存刷新令牌。库保存令牌并根据需要为您管理刷新。您只需始终使用
AcquireSilent…
(不记得确切的方法名称)检索令牌,它将尽可能从缓存中提取,并在需要时刷新


在您的代码中,您可能会看到这个问题,因为在刷新中您没有发布到v2端点。将端点URL更改为
https://login.microsoftonline.com/common/oauth2/v2.0/token
,看看这是否解决不了问题。如果它仍然不起作用,您可以与比较。

嗨,杰森!我一直在使用作为我的主要参考框架,但就是无法获得参数和url的正确组合,以使刷新令牌正常工作。此外,阅读这些电子邮件将由一个独立的解决方案处理,因此我肯定需要自己存储刷新令牌。这似乎是一个常见的。。。也许它应该被阿达尔暴露出来。将/v2.0添加到我的帖子URL确实解决了所有问题,但是,oauthplay中的请求/响应窗口显示了此调用的错误URL。再次感谢!谢谢你让我知道操场的情况。我一定会把它修好的!嗨,杰森!我一直在使用作为我的主要参考框架,但就是无法获得参数和url的正确组合,以使刷新令牌正常工作。此外,阅读这些电子邮件将由一个独立的解决方案处理,因此我肯定需要自己存储刷新令牌。这似乎是一个常见的。。。也许它应该被阿达尔暴露出来。将/v2.0添加到我的帖子URL确实解决了所有问题,但是,oauthplay中的请求/响应窗口显示了此调用的错误URL。再次感谢!谢谢你让我知道操场的情况。我一定会把它修好的!
var parameters2 = new Dictionary<string, string>
   {
      {"grant_type", "refresh_token"},
      {"refresh_token", originalRefreshToken},
      {"client_id", clientId},
      {"client_secret", clientSecret},
      {"resource","https://outlook.office365.com" }
   };
var content2 = new FormUrlEncodedContent(parameters2);
var response2 = await client.PostAsync("https://login.microsoftonline.com/common/oauth2/token", content2);
var tokens2 = await response2.Content.ReadAsAsync<MicrosoftOAuthAuthenticationModel>();
var newRefreshtoken = tokens2.refresh_token;
var newAccessToken = tokens2.access_token;