C#ADAL AcquireTokenAsync()没有弹出框

我们正在编写一个WCF服务,该服务必须与Dynamics CRM 2016 Online集成。 我正在尝试使用方法AcquireTokenAsync()使用ADAL进行身份validation。 问题是,它会显示一个弹出框,提示用户输入凭据。 当然,我们的应用程序是一项服务,这不是我们想要的。 我们一直在寻找一种无需此弹出框即可进行身份validation的方法。

有一个名为AuthenticationContextIntegratedAuthExtensions的类,它应该有助于“用户名/密码流”。 它有单个方法AcquireTokenAsync ,它会禁止弹出框,但我们没有找到任何方法将密码传递给它。 当仅使用用户名运行时,它会引发基本上说“没有提供密码”的exception。

有谁知道如何解决这个问题? 甚至不必是ADAL。 只是获取OAuth令牌的东西。

 private static string API_BASE_URL = "https://.com/"; private static string API_URL = "https://.com/api/data/v8.1/"; private static string CLIENT_ID = ""; static void Main(string[] args) { var ap = AuthenticationParameters.CreateFromResourceUrlAsync( new Uri(API_URL)).Result; var authContext = new AuthenticationContext(ap.Authority, false); var userCredential = new UserCredential("", ""); var result = authContext.AcquireToken(API_BASE_URL, CLIENT_ID, userCredential); var httpClient = HttpWebRequest.CreateHttp(Path.Combine(API_URL, "accounts")); httpClient.Headers.Add(HttpRequestHeader.Authorization, "Bearer:" + result.AccessToken); using (var sr = new StreamReader(httpClient.GetResponse().GetResponseStream())) { Console.WriteLine(sr.ReadToEnd()); } } 

注意:我使用的是旧版本的ADAL( 2.19.208020213 ),因为看起来密码参数已从UserCredential构造函数中取出。

编辑: ADAL的最新版本具有UserPasswordCredential ,可用于代替UserCredential (并且可能在UserCredential删除Password后立即添加)

编辑2: CRM现在支持服务器到服务器身份validation ,允许您创建应用程序用户。

不使用ADAL就可以获得它的价值

 var postData = new List> { new KeyValuePair("resource", cred.ResourceId), new KeyValuePair("grant_type", "client_credentials"), new KeyValuePair("client_id", cred.ClientId), new KeyValuePair("client_secret", cred.ClientSecret), }; using (var client = new HttpClient()) { string baseUrl = "https://login.windows.net/YourAADInstanceName.onmicrosoft.com/oauth2/"; client.BaseAddress = new Uri(baseUrl); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var content = new FormUrlEncodedContent(postData); HttpResponseMessage response = await client.PostAsync("token", content); string jsonString = await response.Content.ReadAsStringAsync(); var responseData = JsonConvert.DeserializeObject(jsonString); return responseData; } 

好的,最终找到了解决方案。

如果您已使用Azure AD注册应用程序(作为Web App / Web API,而不是本机应用程序),您将收到该应用程序的客户端ID和密钥。

没有弹出窗口获取令牌的代码如下:

 AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync( new Uri(resource+"/api/data/v8.1")).Result; AuthenticationContext ac = new AuthenticationContext(ap.Authority); AuthenticationResult r = await ac.AcquireTokenAsync(ap.Resource, new ClientCredential(clientId,clientSecret)); 

resource是Dynamics CRM部署的基本URL。

在运行时发现身份validation参数,如本MSDN中所述 。