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

Azure.Identity.VisualStudioCredential搭配IIS ApplicationPoolIdentity使用问题:.NET Framework 4.8 WebApi本地开发配置Always Encrypted遇阻

针对你在IIS中运行.NET Framework 4.8 WebAPI时遇到的Always Encrypted+Azure Key Vault访问问题,我整理了几个适合开发环境的可行方案,都是实际调试类似场景时验证过的:

方案1:手动迁移令牌提供者文件到系统配置目录

IIS的应用池身份(不管是默认的ApplicationPoolIdentity还是你切换的个人用户身份),都会默认去C:\WINDOWS\system32\config\systemprofile\AppData\Local\.IdentityService\AzureServiceAuth路径读取令牌文件,而你的Visual Studio登录令牌实际存在于个人用户目录下。我们可以手动迁移文件并配置权限:

  • 操作步骤:
    1. 打开文件资源管理器,导航到C:\Users\<你的用户名>\AppData\Local\.IdentityService\AzureServiceAuth,找到tokenprovider.json文件
    2. 手动创建目标路径:C:\WINDOWS\system32\config\systemprofile\AppData\Local\.IdentityService\AzureServiceAuth(如果路径不存在,需要逐层创建文件夹)
    3. 把复制的tokenprovider.json粘贴到这个新路径中
    4. 给这个目录和文件添加应用池身份的读取权限:右键目录→属性→安全→编辑→添加,输入IIS AppPool\<你的应用池名称>,勾选读取权限后保存
      这个方案不用改代码,适合快速解决临时的本地开发问题。

方案2:改用AzureCliCredential替代VisualStudioCredential

如果你本地已经安装了Azure CLI,并且用az login登录过Azure账号,那么AzureCliCredential可以直接复用CLI的登录状态,不会依赖用户目录的令牌文件,在IIS环境里更稳定:

  • 代码修改示例:
using Azure.Identity;
using Microsoft.Data.SqlClient;

// 替换原来的VisualStudioCredential实例
var keyVaultCredential = new AzureCliCredential();
var dbConnectionString = "你的数据库连接字符串,需包含Column Encryption Setting=Enabled";

using (var sqlConn = new SqlConnection(dbConnectionString))
{
    sqlConn.Attributes.Add(SqlConnectionColumnEncryptionSetting.AlwaysEncrypted);
    sqlConn.Credential = keyVaultCredential;
    // 执行你的数据库查询逻辑...
}
  • 额外注意:如果应用池身份还是无法读取CLI缓存,可以给C:\Users\<你的用户名>\.azure目录添加应用池身份的读取权限。

方案3:使用ClientSecretCredential(适合稳定的开发测试环境)

如果不想依赖本地的Visual Studio或Azure CLI登录状态,可以创建一个Azure AD服务主体,给它分配Azure Key Vault的必要权限(密钥权限:Get、Wrap Key、Unwrap Key),然后用服务主体的信息创建凭证:

  • 代码示例:
using Azure.Identity;
using Microsoft.Data.SqlClient;

var tenantId = "你的Azure AD租户ID";
var clientId = "服务主体的客户端ID";
var clientSecret = "服务主体的客户端密钥";

var keyVaultCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var dbConnectionString = "你的数据库连接字符串,需包含Column Encryption Setting=Enabled";

using (var sqlConn = new SqlConnection(dbConnectionString))
{
    sqlConn.Attributes.Add(SqlConnectionColumnEncryptionSetting.AlwaysEncrypted);
    sqlConn.Credential = keyVaultCredential;
    // 数据库操作逻辑...
}

这个方案不需要交互式登录,适合持续开发测试的场景,不会因为本地用户登录状态变化而失效。

方案4:修复InteractiveBrowserCredential的IIS运行问题(如果必须用交互式验证)

InteractiveBrowserCredential在IIS进程中失败,是因为默认情况下IIS工作进程没有桌面交互权限,我们可以给应用池开启相关权限:

  • 操作步骤:
    1. 打开IIS管理器,找到你的目标应用池
    2. 右键点击应用池→选择高级设置
    3. 在「进程模型」区域,将「加载用户配置文件」设置为True,同时将「允许桌面交互」设置为True(如果你的WebAPI是32位程序,记得勾选「允许32位应用程序」)
    4. 重启应用池生效
  • 对应的代码修改:
using Azure.Identity;
using Microsoft.Data.SqlClient;

var credentialOptions = new InteractiveBrowserCredentialOptions
{
    TenantId = "你的Azure AD租户ID",
    ClientId = "你的Azure AD应用注册客户端ID"
};
var keyVaultCredential = new InteractiveBrowserCredential(credentialOptions);
// 后续的数据库连接逻辑同前...

这个方案会在第一次访问API时弹出浏览器窗口要求登录,适合本地开发时偶尔使用,不适合无人值守的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:12:33