远程访问ASP.NET模拟错误

远程访问ASP.NET模拟错误,asp.net,impersonation,Asp.net,Impersonation,我有一个网站,它托管在我的网络服务器上的IIS上。该网站使用以我的用户名运行的应用程序池。我的用户名在服务器的admin组中 Windows身份验证已启用,而匿名身份验证已禁用。此外,还启用了ASP.NET模拟 我通过添加以下行在web,config中启用了模拟: <identity impersonate="true" /> <authentication mode="Windows" /> 当我在服务器上的浏览器中打开该页面时,该页面工作正常。当我使用相同的URL

我有一个网站,它托管在我的网络服务器上的IIS上。该网站使用以我的用户名运行的应用程序池。我的用户名在服务器的admin组中

Windows身份验证已启用,而匿名身份验证已禁用。此外,还启用了ASP.NET模拟

我通过添加以下行在web,config中启用了模拟:

<identity impersonate="true" />
<authentication mode="Windows" />
当我在服务器上的浏览器中打开该页面时,该页面工作正常。当我使用相同的URL并从我的机器上打开它时,我会得到下面的错误。请注意,当我将其他不使用模拟的网站托管在同一台服务器上并从我的计算机访问它们时,它们会正常工作

我得到的错误是:

用户“NT授权\匿名登录”登录失败


提前感谢您的帮助

这可能是两件事:

  • 您的浏览器不使用Kerberos,而是使用NTLM。由于目标既没有Kerberos票证也没有用户密码,因此它将无法对数据库进行身份验证。您可以通过Kerberos约束委派或在同一台计算机上启用该功能,允许IIS进程在本地模拟任何用户
  • 您的数据库位于另一台主机上:您必须使用Kerberos约束委派
  • 为了清楚起见,需要补充一点:如果您的ADDC不能公开使用(最好不要公开),那么您将无法通过Kerberos进行身份验证。

    NTLM可能会缓解这一问题,但它在不同的浏览器中经常会出现问题—另外:不要使用NTLM—从IIS中删除该提供程序—NTLM已死亡。

    谢谢您的回答。我不知道哪个选项是我的情况,但值得一提的是,数据库位于另一台服务器上,但我的机器可以访问它。如果我在我的机器的IIS上托管该网站并删除模拟,它将工作并成功访问相同的数据库。一般来说,我不知道什么是Kerberos,也不知道如何启用它。如果您不了解Kerberos,最好了解一些相关信息。“Windows集成身份验证”是Kerberos。确保你知道你在用什么!我觉得我对模仿这个话题还不太熟悉,我不确定我的答案是否正确。但是,如果我不应该使用Kerberos或NTLM,那么如何解决这个问题呢?在Intranet中使用Kerberos,在Extranet中使用某些网关(例如WAP+ADFS或TMG)。使用HTTPs可以缓解NTLM问题(NTLM是不安全的,因为存在重播攻击)。这是内部网,也许我应该使用Kerberos,但如何启用它。我已经启用了Windows身份验证,这还不够吗?能否显示您的连接字符串“Default”?确保用于连接SQL Server的用户名可以访问该服务器。另外,请指出您正在使用的身份验证,您可以通过转到SQL Server Management studio,转到安全->登录->右键单击您正在使用的用户并检查属性来检查身份验证。可能重复感谢您的回答:这是连接字符串:用户确实对数据库具有权限。我正在对数据库使用windows身份验证您的连接字符串没有用户名和密码,对吗?
    SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString);
    
            try
            {
                connection.Open();
            }
            catch (Exception ex)
            {
                Response.Write(ex.ToString());
            }
            finally
            {
                if (connection.State != System.Data.ConnectionState.Closed)
                {
                    connection.Close();
                }
            }