0

到目前为止,我有这个。

        public static async Task<OutlookServicesClient> CreateOutlookClientAsync(string capability)
        {
            try
            {

                string authority = CommonAuthority;

                // Create an AuthenticationContext using this authority.
                _authenticationContext = new AuthenticationContext(authority);

                //See the Discovery Service Sample (https://github.com/OfficeDev/Office365-Discovery-Service-Sample)
                //for an approach that improves performance by storing the discovery service information in a cache.
                DiscoveryClient discoveryClient = new DiscoveryClient(
                    async () => await GetTokenHelperAsync(_authenticationContext, DiscoveryResourceId));

                // Get the specified capability ("Contacts").
                CapabilityDiscoveryResult result =
                    await discoveryClient.DiscoverCapabilityAsync(capability);
                var client = new OutlookServicesClient(
                    result.ServiceEndpointUri,
                    async () =>
                        await GetTokenHelperAsync(_authenticationContext, result.ServiceResourceId));
                return client;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                if (_authenticationContext != null && _authenticationContext.TokenCache != null)
                    _authenticationContext.TokenCache.Clear();
                return null;
            }
        }

    }

 private static async Task<string> GetTokenHelperAsync(AuthenticationContext context, string resourceId)
        {
            string accessToken = null;
            AuthenticationResult result = null;
            string myId = WebConfigurationManager.AppSettings["ida:ClientID"];
            string myKey = WebConfigurationManager.AppSettings["ida:Password"];
            ClientCredential client = new ClientCredential(myId,myKey);
            
            result = await context.AcquireTokenAsync(resourceId, client);
            //result =context.AcquireToken(resourceId, ClientID,_returnUri);
            accessToken = result.AccessToken;


            return accessToken;
        }

当我得到结果时,如果我用户 AcquireTokenAsync 我得到一个错误,指出在目录 api.office.com 中找不到标识符为 XXXX 的应用程序,否则如果我运行 AcquireToken,我会弹出登录模式,但会出现错误指示请求必须包含 client_secret 。

我不知道如何解决这个问题,我怀疑这可能与我尝试在 Azure AD 中创建自己的应用程序和使用 VS Connected Service 的实际应用程序配置有关,还有其他人遇到过类似的问题吗?

4

1 回答 1

1

根据您看到的错误,您的应用注册方式似乎存在问题。当应用程序未标记为多租户时,通常会发生第一个错误,并且您使用注册应用程序的租户以外的租户登录应用程序。

第二个错误很奇怪。客户端密码是您从ida:Password元素中读取并传入 ClientCredential 对象的内容。

我昨天刚刚发布了一个.NET 教程,介绍了如何设置这些东西。看看这是否有助于您畅通无阻。

于 2015-04-30T20:01:10.287 回答