C#ADAL AcquireTokenAsync()没有弹出框

时间:2016-06-24 09:52:13

标签: c# wcf active-directory dynamics-crm adal

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

有一个名为AuthenticationContextIntegratedAuthExtensions的类,它应该用于帮助"用户名/密码流"。它有单一的方法AcquireTokenAsync,它会抑制弹出框,但我们还没有找到任何方法将密码传递给它。当仅使用用户名运行时,它会引发异常,基本上表示"没有提供密码"。

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

3 个答案:

答案 0 :(得分:3)

private static string API_BASE_URL = "https://<CRM DOMAIN>.com/";
private static string API_URL = "https://<CRM DOMAIN>.com/api/data/v8.1/";
private static string CLIENT_ID = "<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("<USERNAME>", "<PASSWORD>");

    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(可能会在Password被移除后立即添加UserCredential

编辑2: CRM现在支持Server to Server Authentication,允许您创建应用程序用户。

答案 1 :(得分:1)

不使用ADAL的价值

var postData = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("resource", cred.ResourceId),
            new KeyValuePair<string, string>("grant_type", "client_credentials"),
            new KeyValuePair<string, string>("client_id", cred.ClientId),
            new KeyValuePair<string, string>("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<Token>(jsonString);
            return responseData;
        }

答案 2 :(得分:0)

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

如果您已使用Azure AD注册您的应用程序(作为Web应用程序/ 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));

资源是Dynamics CRM部署的基本URL。

在运行时发现身份验证参数,如MSDN acticle中所述。