如何在不使我的调用链异步的情况下调用ApplicationTokenProvider?

时间:2018-05-30 17:10:13

标签: c# asp.net-mvc azure

我遇到与此问题相同的问题:

Call to ApplicationTokenProvider never returns

解决方案是使调用方法异步,并且可能是它上面的每个调用异步。我在调用链中有这个方法(在测试工具中工作正常)并且在MVC控制器中调用时无法返回。我不想让它上面的每个调用异步 - 它需要大量的重新设计和丑陋的架构来引入对我的代码无用的异步功能。

当然有一些方法可以让这个#$(*&#同步工作?这是我目前的代码:

public void Authenticate()
{
    var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(TenantId, ApplicationId, Secret).Result;
    var monitorClient = new MonitorManagementClient(serviceCreds) {SubscriptionId = SubscriptionId.ToString()};

    MonitorClient = monitorClient;
}

第三行对LoginSilentAsync的调用永远不会返回。

1 个答案:

答案 0 :(得分:1)

我也可以在myside上重现它。我通过实现自定义ServiceClientCredentials解决了这个问题。以下是演示代码。

 public class CustomCredentials : ServiceClientCredentials
    {
        private string AuthenticationToken { get; set; }

        public override void InitializeServiceClient<T>(ServiceClient<T> client)
        {
            var authenticationContext =
                new AuthenticationContext("https://login.windows.net/yourtenantId");
            var credential = new ClientCredential("clientid", clientSecret: "secret key");

            var result = authenticationContext.AcquireTokenAsync("https://management.azure.com/",
                credential).Result;

            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            AuthenticationToken = result.AccessToken;
        }
    }

2.更改您对以下代码的身份验证功能。

 public void Authenticate()
        {
            var monitorClient = new MonitorManagementClient(new CustomCredentials()) { SubscriptionId = "subscription Id" };
            MonitorClient = monitorClient;
        }

3.在当地测试。

enter image description here