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

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

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

最佳答案

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),因为看来password参数已从UserCredential构造函数中删除。

编辑: ADAL的最新版本具有UserPasswordCredential,可以使用Server to Server Authentication代替UserCredential(并且很可能是从Password中删除了UserCredential后立即添加的)

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

关于c# - 没有弹出框的C#ADAL AcquireTokenAsync(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38010495/

10-10 04:05