代码之家  ›  专栏  ›  技术社区  ›  Liero

为什么asp.net核心应用程序在连接到SQL Server时使用不同于AppPool的用户身份进行Windows身份验证?

  •  0
  • Liero  · 技术社区  · 5 年前

    我已将asp.net core 2.2 web app部署为IIS的网站。我已将应用程序池标识设置为ApplicationPoolIdentity:

    [ IIS Screenshol[1]

    我看得出来 System.Security.Principal.WindowsIdentity.GetCurrent() 返回

    IIS APPPOOL\MyCustomAppPool
    

    但当我尝试使用连接字符串连接到SQL Server时:

    Server=localhost;Database=MyDadatabse;Trusted_Connection=True;
    

    我得到以下错误(忽略德语):

    SqlException:Fehler bei der Anmeldung fr den Benutzer“CompanyDomain\ComputerName$”。

    为什么不使用ApplicationPool标识?

    还要注意的是,当我将自定义用户名/密码设置为应用程序池的标识时,它会起作用。

    1 回复  |  直到 5 年前
        1
  •  5
  •   David Browne - Microsoft    3 年前

    为了澄清这一点, APPPOOL\MyCustomAppPool ,如LocalServer、NetworkService和每服务SID都是本地标识。它们不存在于域中,因此无法用于访问远程资源。然而,服务器 它本身

    如果您在IIS服务器上有多个应用程序池标识,并且需要区分它们对网络资源的访问,或者防止累积计算机帐户的权限,则需要为应用程序池设置域帐户。

    如果您使用应用程序池标识连接到本地SQL Server,则错误消息将(令人困惑地)声明您正在使用计算机帐户连接。这是SQL Server报告错误的一个缺陷。例如,如果我尝试从IIS应用程序连接到本地SQL Server,它将失败,

    Login failed for user 'MyDomain\MyServer$'
    

    直到我授予对本地SQL服务器的访问权限

    create login [IIS APPPOOL\DefaultAppPool] from windows
    create user [IIS APPPOOL\DefaultAppPool] for login [IIS APPPOOL\DefaultAppPool]
    grant select to [IIS APPPOOL\DefaultAppPool]