即使使用正确的凭据,也可以取消授权创建DiscoveryClient的问题

时间:2015-03-24 12:36:57

标签: c# office365

我的问题与此线程类似

Unable to create Discovery Client object for Accessing Office365 calendar

我100%确定客户端凭据是正确的,因为我正在获取访问令牌,但在DiscoveryClient的过程中,我收到了 DiscoveryFailedException - >未经授权

      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;
    }

感谢您提前提供任何帮助

马切伊

1 个答案:

答案 0 :(得分:1)

我刚刚与Discovery API人员确认它不支持客户端凭据,因此可以解释它!正如我的评论中所建议的,只是跳过发现。