我们正在编写一个 WCF 服务,该服务必须与 Dynamics CRM 2016 Online 集成。我正在尝试使用 ADAL 进行身份验证,使用方法AcquireTokenAsync()
。问题是,它会显示一个弹出框,提示用户输入凭据。当然,我们的应用程序是一种服务,这不是我们想要的。我们一直在寻找一种无需弹出框即可进行身份验证的方法。
有一个类叫做AuthenticationContextIntegratedAuthExtensions
,这应该有助于“用户名/密码流”。它有单一的方法AcquireTokenAsync
,它会抑制弹出框,但我们还没有找到任何方法将密码传递给它。当仅使用用户名运行时,它会引发异常,基本上表示“未提供密码”。
有谁知道如何解决这个问题?甚至不必是 ADAL。只是获取 OAuth 令牌的东西。
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 构造函数中取出。
EDIT:ADAL 的最新版本有用户密码凭证可以用来代替UserCredential
(并且可能是在Password
被删除于UserCredential
)
EDIT 2:CRM现在支持服务器到服务器身份验证它允许您创建应用程序用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)