2016-01-20 52 views
-1

嘗試啓動試圖與Microsoft Outlook API聯繫的控制檯應用程序時出現身份驗證錯誤。我用控制檯日誌創建了這個應用程序,我將在這個問題中顯示。似乎我試圖默默地獲取令牌時出現此錯誤,但從我看到的每個示例看來,似乎我都在正確地執行此操作。這些是我看到的兩個功能導致的錯誤。使用509證書進行身份驗證時未生成令牌

認證

標記獲取功能:

private static string EMAIL_SERVICE_ACCOUNT = "********@dell.com"; 
    private static string EMAIL_SERVICE_PWD = "*******";   
    private static string ClientID = "************************"; 
    private static string ClientSecret ="**********************"; 
    private static Uri ReturnUri = new Uri("https://localhost:44300/"); 
    private static string CommonAuthority = "https://login.windows.net/Common"; 
    public static AuthenticationContext AuthContext { get; set; } 
    private static async Task<AuthenticationResult> AcquireTokenAsync(string authContextUrl, string resourceId) 
    { 
     AuthenticationResult ar = null; 
     try 
     {    
      AuthContext = new AuthenticationContext(authContextUrl);    

      if (AuthContext.TokenCache.ReadItems().Count() > 0) 
      { 
       string cachedAuthority = 
        AuthContext.TokenCache.ReadItems().First().Authority; 
       AuthContext = new AuthenticationContext(cachedAuthority); 
      } 

      //ClientCredential clientCredential = new ClientCredential(ClientID, ClientSecret); << not invoking this 
      ar = (await AuthContext.AcquireTokenSilentAsync(resourceId, ClientID)); 
     } 
     catch (Exception e) 
     { 
      //not in cache; we'll get it with the full oauth flow 
      if (e.InnerException != null) 
       Console.WriteLine("Inner exception: {0}", e.InnerException); 
     } 

     if (ar == null) 
     { 
      try 
      { 
       UserCredential uc = new UserCredential(EMAIL_SERVICE_ACCOUNT, EMAIL_SERVICE_PWD); 
       ar = AuthContext .AcquireToken(resourceId, ClientID, uc); 
      } 
      catch (Exception acquireEx) 
      { 
       //utter failure here, we need let the user know we just can't do it 
       Console.WriteLine("Error trying to acquire authentication result: " + acquireEx.Message); 
       if (acquireEx.InnerException != null) 
        Console.WriteLine("Inner exception: {0}", acquireEx.InnerException); 
      } 
     } 
     return ar; 
    } 

這是我的函數創建Outlook客戶端

  private static async Task<OutlookServicesClient> GetOutlookClient() 
    { 
     OutlookServicesClient oc = null; 

     try 
     { 
      string MAIL_RESOURCE_ID = "https://outlook.office365.com"; 

      AuthenticationResult ar = await AcquireTokenAsync(CommonAuthority, MAIL_RESOURCE_ID); 

      if (ar != null) 
      { 
       oc = new OutlookServicesClient(new Uri("https://outlook.office365.com/api/v1.0"),() => 
       Task.Run(() => 
       { 
        return ar.AccessToken; 
       })); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error getting Outlook client: " + ex.Message); 
      if (ex.InnerException != null) 
       Console.WriteLine("Inner exception: {0}", ex.InnerException); 
     } 

     return oc; 
    } 

這是我得到的錯誤

enter image description here

+0

你得到了什麼錯誤? –

+0

@丹尼爾必須重新啓動PC,現在已經發布錯誤 – EasyE

回答

0

好我找到了我想做的工作,我爲了解決這個問題,我決定繼續使用x509 cert v2,我還發現這對我的項目來說會更好,因爲它將成爲一個控制檯應用程序。這是我的代碼的一個片段,有效地獲取令牌以便對Azure進行身份驗證。 509獲得授權令牌的證書:

public static string Aquire_Token() 
    { 
     AuthenticationResult authenticationResult = null; 
     try 
     { 
      string authority = ConfigurationManager.AppSettings["Authority"]; 

      AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); 

      string certfile = ConfigurationManager.AppSettings["ClientCertificatePfx"]; 

      X509Certificate2 cert = new X509Certificate2(certfile, ConfigurationManager.AppSettings["ClientCertificatePfxPassword"], X509KeyStorageFlags.MachineKeySet); 

      ClientAssertionCertificate cac = new ClientAssertionCertificate(CLIENTID, cert); 

      authenticationResult = authenticationContext.AcquireToken(RESOURCEID, cac); 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine("Issue with Aquireing Token :" + ex.Message); 
     } 
     return authenticationResult.AccessToken; 
    } 
} 
相關問題