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

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,然后改用集成身份验证连接字符串,无需传入密码:

  1. IIS部署场景:设置应用程序池的身份为sg\DevtestB;
  2. 控制台运行场景:使用runas /user:sg\DevtestB dotnet run命令启动项目;
  3. 修改后的连接字符串:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:30:13