Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.Net web应用程序正在尝试使用模拟和委派连接到SQL Server_Asp.net_Iis 7_Kerberos_Delegation - Fatal编程技术网

ASP.Net web应用程序正在尝试使用模拟和委派连接到SQL Server

ASP.Net web应用程序正在尝试使用模拟和委派连接到SQL Server,asp.net,iis-7,kerberos,delegation,Asp.net,Iis 7,Kerberos,Delegation,我试图在内部网ASP.Net web应用程序中使用模拟和委派,以便将经过身份验证的用户凭据传递到SQL Server web服务器和SQL server是两台独立的计算机,但位于同一个域中,因此需要委派 我已经做了以下工作: 在我的web应用程序的web.config中设置和 已启用从web服务器到Active Directory中SQL server上的MSSQLSvc服务的受约束委派 仅通过IIS在网站中启用Windows身份验证 显然,这一切都应该有效,但事实并非如此(SQL Serv

我试图在内部网ASP.Net web应用程序中使用模拟和委派,以便将经过身份验证的用户凭据传递到SQL Server

web服务器和SQL server是两台独立的计算机,但位于同一个域中,因此需要委派

我已经做了以下工作:

  • 在我的web应用程序的web.config中设置
  • 已启用从web服务器到Active Directory中SQL server上的MSSQLSvc服务的受约束委派
  • 仅通过IIS在网站中启用Windows身份验证

显然,这一切都应该有效,但事实并非如此(SQL Server拒绝匿名用户的访问——“用户“NT AUTHORITY\anonymous LOGON”登录失败”)

在IIS7中,应用程序池设置为使用集成管线模式,并使用NetworkService标识运行。该网站仅启用了Windows身份验证,禁用了扩展保护,启用了内核模式身份验证,并且NTLM是提供程序


我读过的所有网页似乎都表明我的设置应该可以工作。我遗漏了什么?

我发现了答案:

IIS7中的Windows身份验证提供程序必须设置为协商:Kerberos,而不是NTLM。这意味着必须禁用内核模式身份验证设置。这似乎很好。我想我说得对,当使用自定义标识(即一个特定标识)时,需要内核模式身份验证。委派可以使用任意数量的标识。所以一切都很好


关于这一点,我也写了一篇文章,详细介绍了一点。

否-说您需要Kerberos(一个SPN)来信任服务器进行委派是不准确的,这是唯一的方法。是的,这是实现这一点的一种方法(您确实需要通过Kerberos实现这一点),但这并不是唯一的方法,甚至从技术上讲也不是最安全或最简单的方法。您真的希望必须进行额外的配置,并为每个web用户创建一个SQL数据库登录名吗?如果其中任何一个帐户被泄露怎么办?帐户越多,漏洞就越多

不,创建一个域服务帐户,让它访问SQL。如果您的安全人员锁定了某些内容,请授予该用户以下权限:作为服务登录、作为批处理作业登录,以及允许本地登录。或者,如果这只是为了开发和测试理论,或者你不在乎,或者找不到设置,或者以后仍然出现错误,那么这可能不会获得大量的追随者,但是给它本地管理员(有时你必须做你必须做的事情-一些安全专家将事情锁定得比我想写的更紧-总是可以在以后对安全性进行故障排除以将其锁定)。然后将该帐户设置为应用程序池上的自定义帐户,并在SQL中为该帐户提供登录名。仅在一个数据库上为其提供dbo

在IIS中的网站上,将身份验证类型设置为Windows。我在其他博客中看到他们说“Basic”,所以Kerberos可以工作,但NTLM使用Windows身份验证。在IIS 7中,您可能还希望启用ASP.NET模拟。就我个人而言,我只在IIS 6上尝试过这一点,但主体是相同的

在web.config中,将其添加到
下,这是
的“对等点”:

如果在web.config中为impersonate标记和SQL连接填写服务帐户后,它将无法与该帐户连接,则可以使用WindowsImpersonationContext()使用模拟方法。具体来说,您需要wic.impersonate()和wic.Undo()获取他们的令牌后。您可以从web.config以AppKeys的形式读取服务帐户域、名称和密码


简而言之,解决这个问题的方法是有的。你甚至可以在web.config中加密密码——无论是在ConnectionString中,还是如果你想将密码存储在AppKey中而不是直接存储在“impersonate”标记中,如果你不想在其中使用纯文本密码(我建议不要这样做),因此,如果需要使用模拟方法(如我所做的),您可以使用它来创建登录令牌。

“SQL Server拒绝匿名用户的访问”,您的
匿名用户
是否有数据库访问权限?匿名用户没有数据库访问权限。我不希望匿名用户访问数据库,我希望是网站的当前用户。委派应意味着当前用户是访问数据库的用户,而不是匿名用户。这实际上并不表示您的意思呃他的question@FireLizzard,嗯,我给出了“在内部网ASP.Net web应用程序中使用模拟和委派,以便将经过身份验证的用户凭据传递到SQL Server”所需的所有步骤。这需要1)svc帐户,2)本地安全策略中的权限(如上所述)3)SQL中的权限(如上所述dbo),3)将帐户添加到应用程序池标识中,4)将IIS中的网站设置为Windows身份验证,5)在Web.config中设置连接字符串,6)在Web.config中设置身份验证标记和标识,7)将连接字符串添加到代码中,8)在MSDN链接中使用模拟代码(如果不起作用)。不同的环境将具有不同的权限,而他可能有也可能没有特权授予该帐户所需的权限。如果不了解他的环境,就很难给出具体的工作方法。他需要尝试赋予svc帐户我指定的权限,并设置网站和web.config。也许它在没有MSDN模拟代码的情况下可以工作,也许不行。对于我刚刚完成的实现,当我发布这些步骤时,我需要它。对于我最近使用Kerberos、SPN和svc帐户所做的一件事,我没有这样做。这是如何将用户的凭据传递给SQL的?您的web.config代码段中的应用程序模拟的是服务帐户,而不是用户。因此,由于您的解决方案没有使用用户的帐户
<connectionStrings>
  <add 
     name="NorthwindConnectionString" 
     connectionString="Data Source=serverName;Initial 
     Catalog=Northwind;Integrated Security=SSPI;User 
     ID=userName;Password=password"
     providerName="System.Data.SqlClient"
  />
</connectionStrings>
<authentication mode="Windows"/> 
<identity impersonate="true"
      userName="domain\user" 
      password="password" />
using System.Configuration;

string connString = String.Empty;
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0)
{
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here
        Console.WriteLine("Northwind connection string = \"{0}\"",
        connString.ConnectionString);
    else
        Console.WriteLine("No Northwind connection string");
}