最新的 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
代码:
您是否使用 Azure.Identity 1.11.2 进行过测试?该存储库中修复了一些错误。
我终于找到了它在这里,但我应用了一些小的修改以使其能够与 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
。