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
相关产品推荐
相关产品推荐

