ASP.NET Core 7 Web API域用户连接SQL Server失败,Node.js可正常连接
问题描述
使用域用户账号sg\DevtestB,在Node.js环境中通过以下代码可成功连接SQL Server(服务器B-SG-SQ,数据库DevTest)并查询samples表数据:
var http = require("http"); const sql = require("mssql"); const port =3333; sql.connect('Server=B-SG-SQ;Database=DevTest;User Id=sg\\DevtestB;Password=DevtestB123;Encrypt=true;trustServerCertificate=true') .then((conn) => { console.log(conn); console.log("MSSQL: connected"); conn.query(`select * from samples`) .then(data => console.log(data)) .then(() => conn.close()) }).catch(err => { console.log("err " + err) });
但在ASP.NET Core 7 Web API中使用相同连接字符串创建SqlConnection时,出现错误:
Login failed for user 'sg\DevtestB'
相关代码如下:
public class DataContext { private readonly DbSettings _dbSettings; public DataContext(IOptions<DbSettings> dbSettings) { _dbSettings = dbSettings.Value; } public IDbConnection CreateConnection() { var connectionString = "Server=B-SG-SQ;Database=DevTest;User Id=sg\\DevtestB;Password=DevtestB123;Encrypt=true;TrustServerCertificate=true"; return new SqlConnection(connectionString); } }
差异原因
核心差异在于Node.js和.NET的SQL Server驱动对域账号身份验证的处理逻辑不同:
- Node.js的
mssql库(依赖tedious驱动)支持在连接字符串中直接通过User Id=domain\\user;Password=xxx的格式,显式传入域账号的密码完成身份验证; - .NET的
SqlConnection(ASP.NET Core 7默认使用Microsoft.Data.SqlClient驱动)默认会将带域前缀的User Id识别为Windows集成身份验证请求,此时会忽略连接字符串中的Password参数,转而使用Web API进程的当前运行身份尝试连接。如果进程身份不是sg\DevtestB,就会触发登录失败错误。
解决方法
方法1:指定身份验证模式为SqlPassword
修改连接字符串,添加Authentication=SqlPassword参数,强制驱动使用你提供的账号和密码完成身份验证:
var connectionString = "Server=B-SG-SQ;Database=DevTest;User Id=sg\\DevtestB;Password=DevtestB123;Encrypt=true;TrustServerCertificate=true;Authentication=SqlPassword";
该方式适用于Microsoft.Data.SqlClient驱动,ASP.NET Core 7默认已包含此包。
方法2:使用Windows集成身份验证(更安全)
配置Web API的运行身份为sg\DevtestB,然后改用集成身份验证连接字符串,无需传入密码:
- IIS部署场景:设置应用程序池的身份为
sg\DevtestB; - 控制台运行场景:使用
runas /user:sg\DevtestB dotnet run命令启动项目; - 修改后的连接字符串:
var connectionString = "Server=B-SG-SQ;Database=DevTest;Integrated Security=true;Encrypt=true;TrustServerCertificate=true";
方法3:确认SQL Server配置
确保SQL Server已开启混合模式身份验证,且sg\DevtestB已被创建为SQL Server登录名,并映射到DevTest数据库的对应用户,同时赋予该用户查询samples表的权限。
内容的提问来源于stack exchange,提问作者Vadim Tomashevsky
相关产品推荐
相关产品推荐

