2017-07-31 35 views
5

我的網絡服務,目前正在做基本的用戶名/密碼認證,以認購交換用戶接收的事件(如新郵件事件等),象下面這樣:如何使用OAuth的認證訪問EWS API的

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協議。我看到一些例子,但他們似乎都在談論如何驗證客戶端(https://msdn.microsoft.com/en-us/library/office/dn903761%28v=exchg.150%29.aspx?f=255&MSPPError=-2147217396),但是我找不到一個如何使用OAuth協議驗證交換用戶身份的示例。任何代碼示例都會有所幫助。謝謝。

+0

在爲EWS調查oauth時出現的另外一件事是,它僅適用於Office 365而不適用於Exchange服務器。 https://msdn.microsoft.com/zh-cn/library/office/dn903761(v=exchg.150).aspx表示「EWS的OAuth身份驗證僅在Exchange中作爲Office 365的一部分提供。EWS應用程序需要「完全訪問用戶的郵箱」權限。「 – tavier

+0

不幸的是,這些鏈接都沒有談到如何使它與EWS託管API協同工作。我在問題中發佈的msdn網址似乎並沒有對用戶進行身份驗證,只是授權客戶端似乎是 – tavier

+0

你看過https://blogs.technet.microsoft.com/ronba/2016/05/09/using-powershell -and-the-office-365-rest-api-with-oauth /? – Eris

回答

4

目前尚不清楚'web服務'是什麼意思,以及您目前如何獲取用戶名和密碼。如果這是用戶需要登錄或通過憑據的某種網站,那麼您必須從瀏覽器啓動OAuth2授權,如將客戶端瀏覽器重定向到授權端點以啓動implicit grantcode grant。一旦用戶登錄代碼或訪問令牌(取決於授權),用戶將在OAuth2服務器上(而不是在您的應用程序中)呈現登錄屏幕,並返回到您的應用程序,您可以在ExchangeService構造函數中使用該應用程序。

如果該'網絡'服務是在用戶計算機上運行的某種服務,則可以使用下面描述的方法之一。使用AuthenticationContext

的例子似乎

獲取的accessToken是基於一箇舊版本的AuthenticationContext類的。

other version似乎是較新的,AcquireToken現在更名爲AcquireTokenAsync/AcquireTokenSilentAsync

無論您使用的是哪個版本,您都無法像在當前代碼中那樣傳遞用戶名和密碼。但是,您可以讓AcquireToken[Async]方法提示用戶輸入憑據。老實說,讓您的應用程序直接處理這些用戶機密更安全。在你知道之前,你會在數據庫中存儲純文本密碼(希望你還沒有)。

在這兩個版本中,這些方法都有很多重載,所有重載都有不同的參數和稍微不同的功能。爲了您的使用情況我覺得這很有趣:

提示行爲汽車,在這兩個vesions ,意思是:當用戶未被緩存時,用戶將被要求提供憑證AuthenticationContext這兩個構造函數都允許您傳遞一個令牌緩存,這是您可以自己實現的一些東西。緩存內存,文件或數據庫中的令牌(有關示例文件緩存實現,請參見this article)。

獲取的accessToken手動

如果你真的想從代碼的用戶憑據傳遞不提示用戶,附近總是有一種方式。在這種情況下,您必須按照OAuth2 specificatioin/RFC6749中所述實施Resource Owner Password Credentials grant

巧合與否,我有一個名爲oauth2-client-handler一個開放源碼庫實現此與HttpClient使用,但不管怎麼說,如果你想要走這條路線,你可以深入到代碼,特別是從this method開始。

使用訪問令牌

一旦你有一個訪問令牌,您可以用樣本進行上this MSDN page,f.e:

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

我回答了很多問題,謝謝:)但是,爲了擺脫處理用戶的密碼,我們想實現oauth(這就是我對oauth的理解),所以有可能徹底取消用戶的用戶名和密碼認證並使用訪問令牌認證用戶?我閱讀了一些與模仿用戶相關的內容,但沒有得到一個很好的示例代碼來符合我的要求。 – tavier

+0

此外,ExchangeService對象似乎有一個名爲ImpersonatedUserId的屬性,這是否意味着我可以模擬該特定用戶並訂閱他的通知。我想不是,但只是想確保:) – tavier

+0

感謝編輯,實際上我的應用程序是一個Web API的一些端點(沒有任何用戶界面),一些電子郵件客戶端的用戶將通過他的憑據(這是當前流程),但是,如果可能的話,我們希望取消傳遞密碼的需要。 – tavier