.net-core - 使用 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)。
我可以/应该在某处覆盖该地址吗?
是否缺少其他配置?
解决方案
这些身份验证方式适用于不同的场景,例如,如果要使用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
,它可以适用于任何场景,请按照以下步骤操作。
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();
}
推荐阅读
- javascript - 如何使用 nodejs 将消息发送到 RabbitMQ 队列
- css - Tailwind CSS、Next.js 图片组件马赛克式设计
- mapbox - 从 SQL Server 实时更新数据集或切片集
- javascript - 如何在所有 useEffect 和 fetches 完成之前显示加载屏幕?
- javascript - 如果输入的类型为“file”,如何在 React 中的输入元素上获得验证错误
- php - Laravel:带有自定义列的通知表
- javascript - Bootstrap V5 Alert Dismissing:单击“关闭按钮”时要求确认
- mysql - 我如何在每个 12 月 31 日使用 SQL TRIGGER?
- c++ - 未定义的参考错误我该怎么办?
- python-3.x - 无法使用 xarray.open_mfdataset() 调用打开多个 .nc 文件!因为单个文件中没有时间维度(文件中只有 lat & lon dim)