az account获取token无需MFA即可访问SQL MI的原因排查
az account get-access-token访问SQL MI无需MFA,但az login仍需验证 我正在编写一个与SQL托管实例(SQL MI)交互的PowerShell脚本,采用.NET框架的SqlConnection进行连接。通过az account get-access-token获取令牌完成认证,全程无需输入密码或MFA就能访问数据库,执行suser_sname()显示的是我的AAD登录账号。
我已经通过注销RDP会话、登出微软账号等操作排除了登录缓存问题,但执行az login --tenant $tenant时仍然需要MFA验证。想搞明白为什么访问SQL MI的时候不需要MFA就能获取权限。
复现代码:
$SqlConn = New-Object System.Data.SqlClient.SqlConnection $SqlConn.ConnectionString="Server=$DBServer;Encrypt=True;TrustServerCertificate=True;Connection Timeout=10;ApplicationIntent=ReadOnly;" # 无需任何提示即可返回有效令牌 $SqlConn.AccessToken=$(az account get-access-token --tenant $tenant --resource https://database.windows.net --query accessToken -o tsv) $SqlConn.Open()
这种情况核心是你的环境中存在非交互式的持久化身份验证上下文,和普通用户登录缓存无关,常见原因有以下几种:
托管身份自动认证
如果脚本运行在Azure虚拟机、函数App等支持托管身份的资源上,系统会自动为该资源分配托管身份(系统分配或用户分配)。az account get-access-token会优先调用这个身份获取令牌,而托管身份本身属于服务级身份,不需要MFA验证。你可以执行az account show查看输出中的userAssignedIdentities或systemAssignedIdentity字段,确认是否使用了托管身份。服务主体凭据缓存
之前可能通过az login --service-principal -u <client-id> -p <secret> --tenant <tenant-id>这类非交互式命令登录过服务主体,这类凭据会持久保存在本地~/.azure目录的配置文件中。即使你注销了用户交互式会话,服务主体的缓存不会被清除,az account get-access-token会自动复用这个身份。执行az account list可以查看所有已缓存的身份,若存在类型为servicePrincipal的条目,就是这个原因。凭据管理器留存的刷新令牌
Azure CLI会把访问令牌/刷新令牌存储在Windows凭据管理器(或Linux/macOS的密钥链)中。某些场景下,即使你登出了微软账号,凭据管理器里的有效刷新令牌仍未过期,az account get-access-token可以用它直接换取新的访问令牌,无需重新触发MFA。你可以打开Windows凭据管理器,查找Azure Service Management相关条目,删除后再测试是否需要MFA。
快速验证步骤:
- 执行
az account list --refresh,查看当前所有可用的身份条目,确认正在使用的身份类型 - 执行
az account clear清除所有缓存的登录上下文,再运行az account get-access-token,此时会提示需要重新登录(包括MFA验证)
内容的提问来源于stack exchange,提问作者Nick.Mc

