.NET Core Web应用使用Active Directory Interactive连Azure SQL部署后异常
错误根因
Active Directory Interactive 认证模式依赖交互式桌面环境弹出浏览器窗口完成身份校验,本地Visual Studio运行时处于你的本地桌面环境,支持交互操作所以可以正常完成认证。部署到Azure App Service后是无界面的服务端运行环境,无法触发交互式登录弹窗,因此执行connection.Open()步骤时直接抛出异常。
适配部署场景的解决方案
你的需求为每个访问应用的用户使用自己的微软账号身份访问Azure SQL,且所有用户已加入对应AAD组,按以下步骤配置即可:
步骤1:配置App Service身份与权限
- 开启App Service的微软身份提供商认证,用户访问应用时会先完成微软账号登录,应用可获取到当前登录用户的身份凭证
- 找到App Service对应的AAD应用注册,添加
Azure SQL Database的user_impersonation委托API权限,完成租户管理员全局同意,覆盖所有AAD组内用户的权限授权
步骤2:调整数据库连接逻辑
不再使用Active Directory Interactive认证参数,改为获取当前登录用户的Azure SQL访问令牌传入连接对象,推荐引入Microsoft.Identity.Web NuGet包简化令牌获取逻辑,代码示例如下:
// 构造函数注入ITokenAcquisition服务(Microsoft.Identity.Web内置提供) private readonly ITokenAcquisition _tokenAcquisition; public YourDatabaseService(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async Task<SqlDataReader> ExecuteQueryAsync(string query) { // 连接字符串移除Authentication参数 var connectionString = @"Server=demo.database.windows.net; Database=testdb"; await using SqlConnection connection = new SqlConnection(connectionString); // 获取当前用户访问Azure SQL的令牌 var sqlAccessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "https://database.windows.net/.default" }); connection.AccessToken = sqlAccessToken; await connection.OpenAsync(); using SqlCommand command = new SqlCommand(query, connection); return await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); }
步骤3:确认Azure SQL权限配置
确认你要授权的AAD组已经在目标Azure SQL库中创建了外部用户并分配对应权限,执行SQL示例如下:
-- 替换为实际AAD组名 CREATE USER [业务访问AAD组] FROM EXTERNAL PROVIDER; -- 按需分配对应角色,比如读权限、写权限 ALTER ROLE db_datareader ADD MEMBER [业务访问AAD组]; ALTER ROLE db_datawriter ADD MEMBER [业务访问AAD组];
内容的提问来源于stack exchange,提问作者Taimur Khan
相关产品推荐
相关产品推荐

