【问题标题】:Authenticate Azure Function App to connect to Dynamics 365 CRM online验证 Azure Function App 以在线连接到 Dynamics 365 CRM
【发布时间】:2018-11-15 20:58:23
【问题描述】:

有时您需要知道答案才能提出正确的问题,因此我不确定此查询的标题是否完美。反正就到这里了。

我开发了一个 Azure Function App(基于时间触发器)来在线连接到 Dynamics 365 并做一些工作。都好!由于这是一个 POC,我想看看有什么可能,所以我编写了以下代码。

        IServiceManagement<IOrganizationService> orgServiceManagement;
        orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(System.Environment.GetEnvironmentVariable("OrganizationService")));

        AuthenticationCredentials authCredentials = new AuthenticationCredentials();
        authCredentials.ClientCredentials.UserName.UserName = "[Non-interactive CRM Username here]";
        authCredentials.ClientCredentials.UserName.Password = "[Password here]";
        AuthenticationCredentials tokenCredentials;

        tokenCredentials = orgServiceManagement.Authenticate(authCredentials);

        OrganizationServiceProxy organizationProxy = new OrganizationServiceProxy(orgServiceManagement, tokenCredentials.SecurityTokenResponse);

我的问题...显然,现在 POC 工作了,我想找到一种方法来针对 Azure AD 对 Function App 进行身份验证(而不是在代码中传递凭据)并获取可用于创建 OrganisationServiceProxy 的访问令牌,但我该怎么做。我似乎无法找到一个直接的答案。许多架构师风格的答案都在云端。我需要开发人员风格的答案(先做这个,然后做那个):)

我相信很多新手 azure 开发人员会发现了解这一点很有用。提前致谢。

编辑注意:这个问题与Authenticate with Dynamics 365 from an Azure Function 不同,因为我在同一个租户和订阅中,使用时间触发器而不是网络挂钩。我的函数应用唤醒,连接到 CRM,进行一些计算,更新 CRM 并重新进入睡眠状态。

【问题讨论】:

  • 虽然触发器不同,但是是什么导致其他帖子的建议无效?使用服务到服务设置对我来说很有意义。您将客户端 ID 和机密作为应用设置作为环境变量引用,您可以使用它们从 AAD 获取令牌,然后调用 CRM。
  • 您是否尝试使用 MSI 来验证您的功能?

标签: azure dynamics-crm azure-functions


【解决方案1】:

我已设法使用 Azure Key Vault 保护我的凭据。对于那些想要做同样事情的新手......这里是步骤。

  1. 登录到 azure 门户并创建一个密钥保管库,或者如果您已经有一个,则转到下一步。
  2. 创建密钥保管库后,请转到密钥保管库的机密部分。您现在将为需要保护的每个凭证创建一个秘密。就我而言,我为用户名创建了一个秘密,为密码创建了另一个。每次创建机密时,Azure 都会向您发出机密标识符。请记下这一点,因为稍后您将在 azure 函数配置设置中使用它。
  3. 接下来,您需要前往 Azure Active Directory (Azure AD)。您需要前往应用注册并创建一个新的应用注册。此时,您是否创建了函数应用程序并不重要。此步骤只是通知 Azure AD 你有一个要注册的应用程序,以便它可以向你颁发一个应用程序 ID。在创建应用程序注册时,您需要记下发布的应用程序 ID。同样,您将在函数应用配置设置中使用它。
  4. 仍然在 Azure AD 中,应用注册单击密钥并创建一个新密钥。创建密钥后,Azure 将为您提供密钥值。 (请记下此值,因为这是 Azure 唯一一次向您显示此值。)您在 azure 函数应用配置设置中也需要此应用密钥。
  5. 返回 Azure Key Vault 和您创建的 Key Vault。这次单击访问策略。您在此处所做的是允许您的 Azure AD 注册函数应用连接到此 Key Vault。单击添加新,然后选择主体,找到您在 Azure AD 中注册的应用程序(不要选择您的函数应用程序,它也会显示在此处,您需要选择与您在上面步骤 3 中在 Azure AD 中注册的名称相同的名称) 然后在秘密权限下,选择“获取”并点击保存。
  6. 设置完成。其余的是代码更改以完成所有这些工作。
  7. 将以下 using 语句添加到代码顶部。

    使用 Microsoft.Azure.KeyVault;
    使用 Microsoft.IdentityModel.Clients.ActiveDirectory;

  8. 如果您的函数应用代码位于 Azure 门户中,则将以下内容添加到您的 project.json 文件中。

    { “构架”: { “net46”:{ “依赖”:{ "Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.4", "Microsoft.Azure.KeyVault": "2.0.1-preview", "Microsoft.AspNet.WebApi.Client": "5.2.3", “Microsoft.CrmSdk.CoreAssemblies”:“9.0.0.7” } } } }

  9. 如果您使用的是 Visual Studio,则需要确保将上述引用添加到您的项目中。

  10. 请查看我上面的原始帖子,了解我如何在代码中使用凭据,以及我现在如何在下面的代码中更改它们。

    AuthenticationCredentials authCredentials = new AuthenticationCredentials(); authCredentials.ClientCredentials.UserName.UserName = GetKVSecret("Secret1", log); authCredentials.ClientCredentials.UserName.Password = GetKVSecret("Secret2", log);

  11. 现在这里是 GetKVSecret 函数的代码。

    private static string GetKVSecret(string secretName, TraceWriter log)
    {
    var adClientId = System.Environment.GetEnvironmentVariable("AppADClientID");
    var adKey = System.Environment.GetEnvironmentVariable("AppADKey");
    var secret = System.Environment.GetEnvironmentVariable(secretName);
    
    var keyVault = new KeyVaultClient(async (string authority, string resource, string scope) => {
    var authContext = new AuthenticationContext(authority);
    var credential = new ClientCredential(adClientId, adKey);
    var token = await authContext.AcquireTokenAsync(resource, credential); 
    return token.AccessToken;
    });
    string returnValue;
    try
    {
        returnValue = keyVault.GetSecretAsync(secret).Result.Value;
        log.Info("Secret retrieved from Key Vault");
    }
    catch (Exception error)
    {
        log.Error("Unable to get secrets from Azure Key Vault.", error);
        throw;
    }
    return returnValue;
    

    }

  12. 最后一步,您可以看到我正在从配置中获取 AppADClientID 和 AppADKey。因此,您需要在应用设置屏幕中创建以下条目。
    AppADClientID:您从第 3 步获得的值
    AppADKey:您从第 4 步获得的值
    secret1:您从第 2 步获得的值
    secret2:您从第 2 步获得的值
    secret1 和 2 可能会因您创建的 secret 数量而异。

所以那里!我希望您觉得这很有用,如果您有任何疑问,请在此处发布,我会尽力回答。最后,我必须感谢以下帮助我的资源。

Link 1 Link 2

PS。这是一个用代码发布解决方案的皮塔饼。 Stackoverflow 一直阻止我提交说我在窗口中的代码格式不正确。然而,我后来意识到这是与代码插入冲突的项目符号点上的“自动”项目符号格式。不管怎样,我认为堆栈溢出不应该阻止一个帖子,因为它可能意味着内容提供者会沮丧地放弃(我们还有其他有偿工作要做!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2023-01-15
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多