gpt4 book ai didi

windows - 使用 CredSpec 的经典 ASP/MSSQL 身份验证问题

转载 作者:行者123 更新时间:2023-12-02 19:44:52 24 4
gpt4 key购买 nike

我目前正在尝试对一些旧的(并且很快将被淘汰的)基础架构进行一些改进,为迁移到 .NET 核心做准备。我们有一个小的反馈表,它使用 SQLOLEDB 连接字符串写入 SQL 表。这些字符串适用于以明文定义的用户名/密码,尽管我希望摆脱这种方法以支持集成身份验证。
我做了很多工作才能到达我所在的位置:

  • 构建了一个基于 IIS 并安装了 ASP 功能的 docker 容器。
  • 在 Windows 主机上以集群方式运行容器 - 加入我们的 AD 域。
  • 设置 gMSA 以提供对数据库的域帐户访问。

  • 目前,我已经完成了 MS 的 gMSA on Windows Containers 指南 ( https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts) 中的所有步骤。测试 checkout ,我可以运行 https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/gmsa-troubleshooting#check-the-container 中的所有测试没有问题,但是当我尝试使用我的连接字符串进行连接时,我在日志中收到一个错误,显示:
    2020-09-28 19:36:43 172.17.173.120 POST /Default.asp |42|80040e4d|Login_failed_for_user_'NT_AUTHORITY\ANONYMOUS_LOGON'.
    对我来说,这没有多大意义,因为应用程序池标识设置为网络并且测试在容器上 checkout 。
    现在我已经尝试了一些事情,比如编辑 web.config 以将模拟设置为 true/false,通过 Windows 进行身份验证,但我仍然有点难过。我已将主机设置为允许通过 Kerberos 委派任何服务。
    我还尝试使用以下方式登录:
    docker exec -it --user "NT AUTHORITY\NETWORK SERVICE" cb4 powershell
    然后运行:
    $connectionString = 'Data Source=serverhostname.domain.local;database=databasename;Integrated Security = True;'
    $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $connectionString
    $sqlConnection.Open()
    $sqlConnection | select *
    这会导致数据库连接处于打开状态。
    使用 NetworkService 身份设置应用程序池
    Get-ItemProperty IIS:\AppPools\domain.co.uk\ -Name processModel

    identityType : NetworkService
    userName :
    password :
    loadUserProfile : False
    setProfileEnvironment : True
    logonType : LogonBatch
    manualGroupMembership : False
    idleTimeout : 00:20:00
    idleTimeoutAction : Terminate
    maxProcesses : 1
    shutdownTimeLimit : 00:01:30
    startupTimeLimit : 00:01:30
    pingingEnabled : True
    pingInterval : 00:00:30
    pingResponseTime : 00:01:30
    logEventOnProcessModel : IdleTimeout
    PSPath : WebAdministration::\\413E8843BBEF\AppPools\domain.co.uk\
    PSParentPath : WebAdministration::\\413E8843BBEF\AppPools
    PSChildName : domain.co.uk\
    PSDrive : IIS
    PSProvider : WebAdministration
    Attributes : {identityType, userName, password, loadUserProfile...}
    ChildElements : {}
    ElementTagName : processModel
    Methods :
    Schema : Microsoft.IIs.PowerShell.Framework.ConfigurationElementSchema
    任何建议,将不胜感激!

    最佳答案

    好的,所以我想通了这一点并将我的发现发布在一个公共(public) Gist 中:
    https://gist.github.com/jimbo8098/48fa8d1cd05a61b35534aa107decb3e3
    基本上,问题在于,当应用程序池标识设置为网络时,站点没有,它使用的似乎是 IUSR。鉴于此,我没有将 gMSA 帐户中继到 ASP 的脚本,因此我无法使用集成身份验证。解决方案是运行:

    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "userName" -Value ""; if ($?) {
    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "password" -Value ""; if ($?) {
    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "logonMethod" -Value 2;}}
    这样做是将用户名和密码设置为空白,并将登录方法设置为网络。这是完美的,因为这意味着应用程序池和站点都使用了预期的帐户,即 gMSA 帐户。
    我发现一个非常有用的方法是制作一个测试脚本:
    <%
    Set objNetwork = CreateObject("WScript.Network")
    strNAME = objNetwork.computername
    response.write("Value of strNAME variable: " & strNAME & "<br>")
    response.write("Domain = " & objNetwork.UserDomain & "<br/>")
    response.write("ComputerName = " & objNetwork.ComputerName & "<br/>")
    response.write("UserName = " & objNetwork.UserName & "<br/>")
    %>
    在解决方案之前,这显示了IUSR,并且是我解决问题的重要线索。解决后,UserName为 app$ (其中 app 是 gMSA 的名称)与预期的域。

    关于windows - 使用 CredSpec 的经典 ASP/MSSQL 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64109816/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com