最新的 Azure.Identity 包导致 SqlClient 和 Dynamics 365 出现错误

问题描述 投票:0回答:2

最新的 Azure.Identity 包导致

SqlClient
和 Dynamics 365 出现错误。

我使用

Microsoft Entra Service Principal
身份验证连接到 Dynamics 365,一切正常。我使用 SQL Server Management Studio 20.0.70.0(最新的)。

此外,我有一个使用 Dapper 和

SqlClient
的 C# 应用程序(查看下面的代码)。

一切都很顺利,直到我将

Azure.Identity
套餐升级为
1.11.0
五天前更新)。将其降级为
1.10.4
即可正常工作。

我在 Microsoft Docs 中找不到任何解决方案。

谢谢你。

例外:

ClientSecretCredential 身份验证失败:AADSTS900023:指定的租户标识符“授权”既不是有效的 DNS 名称,也不是有效的外部域。跟踪 ID:52222220-3332-3331-3033-222225335233 相关 ID:fddd3533-aaaa-4fab-8b49-22ea71b32723 时间戳:2024-04-14 20:20:52Z

代码:

c# dynamics-crm microsoft-dynamics azure-identity
2个回答
0
投票

您是否使用 Azure.Identity 1.11.2 进行过测试?该存储库中修复了一些错误。


0
投票

我终于找到了它在这里,但我应用了一些小的修改以使其能够与 Dynamics 365 一起使用。这是代码


private SqlAuthenticationToken? _sqlAuthenticationToken;

protected Func<SqlAuthenticationParameters, CancellationToken, Task<SqlAuthenticationToken?>> GetTokenCallback()
{
    var tenantId = "[Taken From Azure Portal]";
    var clientId = "[Taken From Azure Portal]";
    var clientSecret = "[Taken From Azure Portal]";
    const string defaultScopeSuffix = ".default";

    var cred = new ClientSecretCredential(tenantId, clientId, clientSecret);

    return TokenCallback;

    async Task<SqlAuthenticationToken?> TokenCallback(SqlAuthenticationParameters ctx, CancellationToken cancellationToken)
    {
        var validToken = _sqlAuthenticationToken != null && _sqlAuthenticationToken.ExpiresOn.UtcDateTime > dateTimeService.Now;
        if (validToken) return _sqlAuthenticationToken;

        string scope = ctx.Resource.EndsWith(defaultScopeSuffix)
            ? ctx.Resource
            : ctx.Resource + defaultScopeSuffix;

        var token = await cred.GetTokenAsync(new TokenRequestContext([scope]), CancellationToken.None);
        _sqlAuthenticationToken = new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        return _sqlAuthenticationToken;
    }
}

然后我将

SqlConnection
的创建修改为这样

await using var connection = new SqlConnection(ConnectionString);
connection.AccessTokenCallback = GetTokenCallback();

还有一件事: 您需要从此修改连接字符串

"Server=your-app.crm.dynamics.com; Authentication=Active Directory Service Principal; Encrypt=True; Database=[db-name]; User Id=[clientId]; Password=[clientSecret]"

到此

"Server=your-app.crm.dynamics.com; Encrypt=True; Database=[db-name];

所以我删除了

User Id
Password
Authentication

© www.soinside.com 2019 - 2024. All rights reserved.