设定:
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身份验证。相反,您必须使用基本身份验证。它有效,但我不喜欢用纯文本在公司网络中漂浮的用户帐户名和密码的想法。因此即使它“有效”,我也不接受我自己的发现作为答案。
答案 0 :(得分:4)
当您的IIS使用Windows身份验证对用户进行身份验证,然后在模拟已连接的用户时,它会连接到本地IIS框外的任何资源(如SQL Server实例),该进程称为委派,如Kerberos Protocol Transition and Constrained Delegation中所述。这个过程有时简称为“双跃点”,是许多How-Tos的主题:
答案 1 :(得分:1)
需要一些IIS设置。请参阅以下文档以获得更好的解释:
答案 2 :(得分:0)
我建议您改变在应用中使用AD的方式。
我会将AD用户映射到app内部用户,同时将他们的AD角色映射到app角色,并使用app角色来确定不直接访问存储过程而是访问业务层功能