2015-03-24 2 views
0

Моя проблема похожа на эту темуUnauthorize Проблема создания DiscoveryClient даже с правильными учетными данными

Unable to create Discovery Client object for Accessing Office365 calendar

Я 100% уверен, что клиентские учетные данные являются правильными, так как я получаю маркер доступа, но в процессе из DiscoveryClient Я получаю DiscoveryFailedException -> Uauthorized

 public Uri discoverySer = new Uri("https://api.office.com/discovery/v1.0/me/"); 
    public string discoveryId = "https://api.office.com/discovery/"; 

    public string cmmAth = "https://login.windows.net/Common"; 


    public static AuthenticationContext _authenticationContext { get; set; } 

    public string _settingCliID { get; set; } 

    public string _settingCliSec {get; set; } 

    public async void CreateClient() 
    { 
     NameValueCollection section = (NameValueCollection)ConfigurationManager.GetSection("appSettings"); 
     _settingCliID = section["ida:ClientID"]; 
     _settingCliSec = section["ida:Password"]; 

     OutlookServicesClient outCli = await EnsureClientCreatedAsync(); 
     var eventResults = await outCli.Me.Events.ExecuteAsync(); 
    } 


    public async Task<OutlookServicesClient> EnsureClientCreatedAsync() 
    { 
     try 
     { 
      string authority = cmmAth; 
      _authenticationContext = new AuthenticationContext(authority); 
      DiscoveryClient discoCli = new DiscoveryClient(discoverySer ,async() => await GetTokenHelperAsync(_authenticationContext, discoveryId)); 

      CapabilityDiscoveryResult discoResult = await discoCli.DiscoverCapabilityAsync("Calendar"); 
      var outlookCli = new OutlookServicesClient(discoResult.ServiceEndpointUri, async() => await GetTokenHelperAsync(_authenticationContext, discoResult.ServiceResourceId)); 
      return outlookCli; 

     } 
     catch (DiscoveryFailedException e) 
     { 
      if(_authenticationContext != null && _authenticationContext.TokenCache != null){ 
       _authenticationContext.TokenCache.Clear(); 
      } 
      MessageBox.Show(e.Source); 
      return null; 
     } 
     catch(AdalException e){ 
      MessageBox.Show(e.ErrorCode); 
      return null; 
     } 
    } 

    public async Task<string> GetTokenHelperAsync(AuthenticationContext context, string resourceId) 
    { 
     string accessToken = null; 
     AuthenticationResult result = null; 
     ClientCredential cliCred = new ClientCredential(_settingCliID, _settingCliSec); 
     result = await context.AcquireTokenAsync(resourceId, cliCred); 
     accessToken = result.AccessToken; 
     return accessToken; 
    } 

спасибо за любую помощь заранее

Maciej

+0

Это ответ от Скрипач на этапе DiscoveryClient { «Ошибка»: { «код»: «- 2147024891, System.UnauthorizedAccessException», «сообщение»: "Доступ запрещен У вас нет разрешения на выполнение этого действия или получить доступ к этому ресурсу. "}} – Maevy

+0

Можете ли вы декодировать токен, который вы вернетесь, и посмотреть, выглядит ли он действительным? https://github.com/jasonjoh/office365-azure-guides/blob/master/ValidatingYourToken.md –

+0

ОК, я пропустил много пар значений ключей после декодирования. Таким образом, это недействительно, но что я могу сделать, чтобы сделать его действительным. – Maevy

ответ

1

Я только что подтвердил людям API Discovery, что он не поддерживает учетные данные клиента, чтобы это объяснило это! Как было предложено в моем комментарии, просто пропустите открытие.

+0

После того, как я изменил процедуру на ClientAssertionCertificate, я взял у него некоторый код и создал сертификат. После того, как я приобрел токен доступа, я попытался отправить Httprequest, но получил «{\" error \ ": \" Forbidden \ "}". – Maevy

+0

Да, API Discovery не поддерживает поток учетных данных клиента, даже с сертификатом. –

+0

ahh извините, мой плохой я забыл упомянуть, что я удалил материал Api Discovery, который вы мне сказали, и я имел в виду https://graph.windows.net/ – Maevy