gpt4 book ai didi

c# - 如何使用 OAuth 进行身份验证以访问 EWS API

转载 作者:太空狗 更新时间:2023-10-29 23:12:40 26 4
gpt4 key购买 nike

我的 Web 服务目前正在进行基本的用户名/密码身份验证,以便订阅交换用户接收事件(如新邮件事件等),如下所示:

var service = new ExchangeService(exchangeVersion)
{
KeepAlive = true,
Url = new Uri("some autodiscovery url"),
Credentials = new NetworkCredential(username, password)
};

var subscription = service.SubscribeToPushNotifications(
new[] { inboxFolderFoldeID },
new Uri("some post back url"),
15,
null,
EventType.NewMail,
EventType.Created,
EventType.Deleted,
EventType.Modified,
EventType.Moved,
EventType.Copied);

现在,我应该将身份验证机制替换为使用 OAuth 协议(protocol)。我看到了一些示例,但它们似乎都在谈论对客户端进行身份验证(https://msdn.microsoft.com/en-us/library/office/dn903761%28v=exchg.150%29.aspx?f=255&MSPPError=-2147217396),但我无法在任何地方找到如何使用 OAuth 协议(protocol)对交换用户进行身份验证的示例。任何代码示例都会有很大帮助。谢谢。

最佳答案

目前尚不清楚“网络服务”的含义以及您当前如何获取用户名和密码。如果这是用户需要登录或传递凭据的某种网站,那么您必须从浏览器启动 OAuth2 授权,就像将客户端浏览器重定向到授权端点以启动 implicit grantcode grant .用户将在 OAuth2 服务器(而不是您的应用程序)上看到一个登录屏幕,一旦用户登录代码或访问 token (取决于授权)将返回到您的应用程序,您可以在 ExchangeService 构造函数。

如果该“网络”服务是在用户计算机上运行的某种服务,您可以使用下述方法之一。

使用AuthenticationContext获取AccessToken

该示例似乎是基于旧版本的 AuthenticationContext类。

other version似乎更新了,而且 AcquireToken 现在重命名为 AcquireTokenAsync/AcquireTokenSilentAsync

无论您使用哪个版本,您都无法像在当前代码中那样传递用户名和密码。但是,您可以让 AcquireToken[Async] 方法提示用户输入凭据。老实说,这比让您的应用程序直接处理这些用户 secret 更安全。在不知不觉中,您会将纯文本密码存储在数据库中(希望您还没有这样做)。

在这两个版本中,这些方法都有很多重载,所有重载都具有不同的参数和略有不同的功能。对于您的用例,我认为这些很有趣:

自动提示行为,在这两个版本中,意味着:用户将被要求提供尚未缓存的凭据AuthenticationContext 构造函数都允许您传递 token 缓存,您可以自己实现它。在内存、文件或数据库中缓存 token (有关示例文件缓存实现,请参阅 this article)。

手动获取AccessToken

如果您真的想在不提示用户的情况下从代码中传递用户凭据,总有办法解决。在这种情况下,您必须实现 Resource Owner Password Credentials grant如 OAuth2 规范/RFC6749 中所述。

巧合与否,我有一个名为 oauth2-client-handler 的开源库实现此功能以与 HttpClient 一起使用,但无论如何,如果您想走这条路,您可以深入研究该代码,尤其是从 this method 开始.

使用访问 token

获得访问 token 后,您可以继续 this MSDN page 上的示例, 例如:

var service = new ExchangeService(exchangeVersion)
{
KeepAlive = true,
Url = new Uri("some autodiscovery url"),
Credentials = new OAuthCredentials(authenticationResult.AccessToken))
};

关于c# - 如何使用 OAuth 进行身份验证以访问 EWS API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com