C# ADAL AcquireTokenAsync() 无弹出框

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

我们正在编写一个必须与 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 ),因为密码参数似乎已从 UserCredential 构造函数中取出。

编辑: 最新版本的 ADAL 有 UserPasswordCredential可以用来代替 UserCredential(并且可能是在从 UserCredential 中删除 Password 后立即添加的)

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

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

相关文章:

c# - 独立的 DAL 设计——特定的和通用的

java - 如何使 LDAP 过滤器在 OU 的三个级别中查找值

c# - 文件上传asp.net core - System.ObjectDisposeException : 'Cannot access a closed file.'

wcf - WebServiceHostFactory 和 IIS 身份验证

c# - 是否应为同一实体创建多个数据契约(Contract)

c# - 由于 EndpointDispatcher 的 ContractFilter 不匹配,无法在接收方处理带有 Action 的消息

powershell - 从一个导入 csv 将多个用户添加到多个组

php - 通过 Windows 身份验证登录时,我应该信任 php 变量 $_SERVER[AUTH_USER] 吗? IIS Intranet 托管应用程序

c# - 使用 = 而不是 += 订阅事件

c# - 创建 TreeView 绑定(bind) wpf