首页 > 解决方案 > 使用 Azure Active Directory 的 Azure SQL 身份验证

问题描述

使用时,按照本教程连接可以正常工作:

var connection = (SqlConnection)Database.GetDbConnection();
connection.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;

但现在文档“不再推荐 Microsoft.Azure.Services.AppAuthentication”

因此,如使用带有 SqlClient 的 Azure Active Directory 身份验证中所述更改我的连接,我收到以下错误:

托管用户不支持集成 Windows 身份验证。

尝试使用托管身份获取令牌。无法获取访问令牌。尝试对无法访问的网络进行套接字操作。(169.254.169.254:80)

没有什么可以阻止该地址,但它从哪里获取该 IP?https://database.windows.net/用于获取令牌的教程代码(解析 65.55.23.107)。

我可以/应该在某处覆盖该地址吗?
是否缺少其他配置?

标签: .net-coreazure-active-directoryazure-sql-database

解决方案


这些身份验证方式适用于不同的场景,例如,如果要使用Active Directory Integrated authentication,则需要通过 ADFS 将本地 AD 与 Azure AD 联合,如果要使用,则必须在支持 MSIActive Directory Managed Identity authentication的 Azure 服务中运行代码(需要先启用 MSI) ,因为代码本质上是对azure 实例元数据端点进行API 调用以获取访问令牌,然后使用令牌进行身份验证,它仅在 MSI 支持的服务中可用。

因此,如果您想将代码从旧 sdk 迁移到新 sdk,则需要选择适用于您的场景的正确身份验证方式。这里我推荐你使用Active Directory Service Principal authentication,它可以适用于任何场景,请按照以下步骤操作。

1.向 Azure AD 注册应用程序并创建服务主体

2.获取登录值创建新的应用程序密码

3.向服务主体授予权限CREATE USER [Azure_AD_Object] FROM EXTERNAL PROVIDER

4.然后使用这里的代码,用你的值修复从第2步得到的值。

string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Service Principal; Database=testdb; User Id=AppId; Password=secret";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

推荐阅读