You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure AD认证的ASP.Net应用如何使用登录用户身份连接Azure SQL

用已登录Azure AD用户身份连接Azure SQL的实现方案

我来帮你解决这个问题——要让已登录的Azure AD用户直接用自己的身份连接Azure SQL,核心思路是获取用户的访问令牌,用令牌来认证SQL连接,而不是依赖AD集成(毕竟AD集成在云托管的ASP.NET应用场景里确实容易掉链子)。下面是具体的实现步骤和注意事项:

1. 配置Azure AD应用的权限

首先得确保你的ASP.NET应用在Azure AD里的权限设置正确:

  • 打开Azure Portal,找到你的应用注册,进入“API权限”页面
  • 点击“添加权限”,选择“Azure SQL Database”
  • 添加委托权限里的user_impersonation权限
  • 如果是租户内的应用,记得点击“授予管理员同意”(否则普通用户可能无法获取令牌)

2. 在ASP.NET应用中获取用户的访问令牌

推荐用官方的Microsoft.Identity.Web库来简化令牌获取逻辑,它会自动处理登录状态和令牌缓存:

对于ASP.NET Core应用(.NET 6+)

在Program.cs里配置身份认证和令牌获取服务:

var builder = WebApplication.CreateBuilder(args);

// 添加Azure AD认证
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    // 启用下游API的令牌获取,指定Azure SQL的scope
    .EnableTokenAcquisitionToCallDownstreamApi(new[] { "https://database.windows.net/.default" })
    // 用内存缓存存储令牌(生产环境可以换成分布式缓存)
    .AddInMemoryTokenCaches();

// 其他服务配置...

然后在你的Controller或者Service里注入ITokenAcquisition服务,调用方法获取令牌:

private readonly ITokenAcquisition _tokenAcquisition;

public YourController(ITokenAcquisition tokenAcquisition)
{
    _tokenAcquisition = tokenAcquisition;
}

public async Task<IActionResult> SomeAction()
{
    // 获取当前登录用户的Azure SQL访问令牌
    var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(
        new[] { "https://database.windows.net/.default" });
    
    // 后续用令牌连接SQL...
}

3. 用令牌连接Azure SQL

拿到令牌后,就可以构建SQL连接,把令牌作为认证凭据:

// 基础连接字符串(不要包含User ID、Password或Integrated Security)
var connectionString = "Server=tcp:your-sql-server.database.windows.net,1433;Database=your-database;";

using var sqlConnection = new SqlConnection(connectionString);
// 设置访问令牌
sqlConnection.AccessToken = accessToken;

await sqlConnection.OpenAsync();

// 执行SQL操作示例
using var command = new SqlCommand("SELECT TOP 10 * FROM YourTable", sqlConnection);
using var reader = await command.ExecuteReaderAsync();
// 处理查询结果...

4. 确保用户在Azure SQL中有权限

别忘了在Azure SQL里给用户创建身份并分配权限,否则就算有令牌也无法访问:
登录到Azure SQL的查询编辑器(或者用SSMS),执行以下SQL:

-- 创建外部用户(替换成实际的用户UPN)
CREATE USER [user@your-domain.com] FROM EXTERNAL PROVIDER;

-- 分配数据库角色(比如只读权限)
ALTER ROLE db_datareader ADD MEMBER [user@your-domain.com];

-- 如果需要写权限,可以分配db_datawriter
-- ALTER ROLE db_datawriter ADD MEMBER [user@your-domain.com];

关键注意事项

  • 为什么AD集成不行?:Active Directory Integrated通常依赖本地Windows身份,当你的ASP.NET应用部署在Azure App Service等云环境时,应用的运行身份是服务身份,不是登录用户的Windows身份,所以无法直接用Integrated Security=SSPI来传递用户身份。
  • 令牌缓存:Microsoft.Identity.Web会自动缓存令牌,避免重复请求,生产环境建议用分布式缓存(如Redis)替代内存缓存。
  • 权限范围:获取令牌时的scope必须是https://database.windows.net/.default,这个是Azure SQL的默认scope,对应所有委托权限。

内容的提问来源于stack exchange,提问作者sainadh Nani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:20