问题从ASP.NET传递凭据到SQL Server

时间:2011-10-11 18:18:39

标签: .net asp.net sql-server iis-7

设定:

Windows 2008 Server R2 Enterprise上的IIS,SQL Server 2008 R2 Enterprise,ASP.NET 2.0 Web应用程序。

目的:

我们正在将旧的Web应用程序的安全模型从使用单个SQL Server帐户转换为使用Active Directory帐户。在ASP.NET应用程序中,我们添加了<identity impersonate="true" />作为web.config的<system.web>部分中的第一项。我们添加了包含Active Directory组的数据库角色,用于授予对现有存储过程的访问权限。我们的web.config已包含<authentication mode="Windows"/>。这是我的连接字符串,编辑出服务器和数据库名称:

<add name="DbConn" 
     connectionString="
         Data Source=SERVER;
         Initial Catalog=DBNAME;
         Integrated Security=SSPI;"
     providerName="System.Data.SqlClient"
/>

问题:

尝试打开数据库的SqlConnection时出错:

  

用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。

我没有浏览应用程序的所有逻辑层(网页到.DLL图层),而是投入了一个快速,简单的网页,在Response.Write中执行了一些Page_Load()。我得到了这个(帐户信息已经删除):

  

HttpContext.Current.User.Identity.Name = domain \ my account

     

My.User.Name = domain \ my account

然后Page_Load调用一个执行某些Response.Write的Sub并尝试运行现有的存储过程。我明白了:

  

在打开数据库连接之前......

     

HttpContext.Current.User.Identity.Name = domain \ my account

     

My.User.Name = domain \ my account

     

Sub TestDbCall()失败了! ex.Message =用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。

上面的错误消息打开SqlConnection失败(登录失败...)。显然,ASP.NET应用程序可识别我的域帐户。我的Windows凭据似乎没有从ASP.NET应用程序传播到SQL Server。我不知道为什么。

修改

我发现这个page on microsoft.com表示为了访问不在IIS服务器上的SQL Server(谁会这样做???),你不能在IIS中使用Windows身份验证。相反,您必须使用基本身份验证。它有效,但我不喜欢用纯文本在公司网络中漂浮的用户帐户名和密码的想法。因此即使它“有效”,我也不接受我自己的发现作为答案。

3 个答案:

答案 0 :(得分:4)

当您的IIS使用Windows身份验证对用户进行身份验证,然后在模拟已连接的用户时,它会连接到本地IIS框外的任何资源(如SQL Server实例),该进程称为委派,如Kerberos Protocol Transition and Constrained Delegation中所述。这个过程有时简称为“双跃点”,是许多How-Tos的主题:

答案 1 :(得分:1)

需要一些IIS设置。请参阅以下文档以获得更好的解释:

How to: Access SQL Server Using Windows Integrated Security

答案 2 :(得分:0)

我建议您改变在应用中使用AD的方式。

我会将AD用户映射到app内部用户,同时将他们的AD角色映射到app角色,并使用app角色来确定不直接访问存储过程而是访问业务层功能