【问题标题】:Web service with database : SqlException带数据库的 Web 服务:SqlException
【发布时间】:2011-05-29 11:28:56
【问题描述】:

我编写了一个与 SQL Server'08 数据库一起使用的 Web 服务

当我尝试调用 web 方法时,我得到了这个:

System.Data.SqlClient.SqlException: Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at route.Logic..ctor() in C:\Users\Ilya\Documents\Visual Studio 2010\Projects\MobitourLibrary\route\Logic.cs:line 20
   at Service..ctor() in c:\inetpub\wwwroot\RouteGen\App_Code\Service.cs:line 14

问题出在哪里? 其他使用相同 DB 的 win 表单应用程序工作正常,为什么 WS 不能?

【问题讨论】:

    标签: sql-server database web-services sqlexception


    【解决方案1】:

    Web 服务将在与 WinForms 应用程序不同的用户帐户下运行。 WinForms 应用程序将从登录用户的用户帐户运行,而 Web 服务将是 ASP.NET 使用的帐户。

    您需要在 SQL Server 中设置该帐户并为其授予相关权限。

    基本上,您需要将登录名添加到服务器,并将该登录名作为用户添加到需要它的每个数据库。

    以下是使用 SQL Server Management Studio 时的分步说明:

    • 在对象资源管理器中,打开 SQL Server 树并进入 Security-->Logins 分支
    • 右键单击“登录”并选择“新建登录...”
    • 在登录名旁边,点击“搜索”
    • 单击“高级”以获取“选择用户或组”对话框
    • 点击“立即查找”
    • 滚动浏览对话框底部的列表,找到相关用户并双击它。对话框将关闭。
    • 按“确定”。对话框将关闭。
    • 返回“登录 - 新建”对话框,按“确定”

    您现在有一个新的登录名。

    现在,在数据库中创建用户。

    • 打开树的数据库分支。
    • 为您需要的特定数据库打开分支,然后是 Security-->Users 分支。
    • 右键单击“用户”并选择“新用户...”
    • 写一个用户名(不一定要和登录名匹配,但一般是这样)
    • 在“登录名”旁边按“...”按钮
    • 在选择登录对话框中按“浏览”
    • 在“浏览对象”对话框中检查所需的登录名。
    • 按“确定”。对话框将关闭
    • 按“确定”。选择登录对话框将关闭。
    • 选择“此用户拥有的架构” - 通常为“db_owner”
    • 选择数据库角色成员 - 通常它将是由 DBA 创建的特定角色,如果不是,则为 db_datareader 和 db_datawriter。如果您有问题,请选择 db_owner,然后与您的 DBA 一起更正权限(您不想为 ASP.NET 进程分配 DB Owner 权限,除非您确实必须这样做,这是等待发生的安全漏洞)
    • 按“确定”关闭“数据库用户新建”对话框。

    现在应该都好了。

    您可以更改 Web 服务中的连接字符串,以使其使用特定帐户连接到 SQL Server。

    【讨论】:

    • 感谢您的回答,但我没有清楚地了解我需要向 SQL Server 添加什么登录名?
    • 如果您阅读了它告诉您的异常消息:用户“IIS APPPOOL\ASP.NET v4.0”登录失败。
    • 我已经更新了答案以提供适用于我的 SQL Server 2008 Management Studio 实例的分步说明
    • 太棒了!但是我应该添加什么用户名?我没有类似“IIS APPPOOL\ASP.NET v4.0”的东西。有“网络服务”,也许我需要这个?例如还有“远程访问”
    • APPPOOL 实际上是以特定用户身份登录的,您可以转到 IIS 以查看与应用程序池相关联的身份,然后使用 SQL Server 进行设置。更多信息在这里:learn.iis.net/page.aspx/624/application-pool-identities 此外,还可以设置特定的 SQL Server 登录帐户,并在连接字符串中使用这些帐户而不是 Windows 帐户。
    【解决方案2】:

    Colin Mackay 已详细解答了您的问题。这是我的两分钱。

    如果您的环境中设置了 Active Directory 域,我会建议在您的连接中包括 user idpassword。相反,我会建议以下内容:

    1. 创建一个域帐户,例如 MyDomain\webservice,其中 MyDomain 将是活动目录域,webservice 将是该域中的 Windows 用户帐户。在SQL 中,为这个新的域帐户用户提供访问数据库的适当权限。

    2. Internet Information Services (IIS) Manager 中,将应用程序池更改为在此服务帐户下运行。如果您运行的是 IIS 7.5,可以执行以下步骤:

    3. IIS 中,展开&lt;server name&gt; 节点并单击Application Pools

    4. 最好新建一个Application Pool,这样就不会干扰其他可能使用应用程序池ASP.NET v4.0的应用程序的功能。

    5. 创建新的应用程序池(比如WebServiceAppPool)类似于 ASP.NET v4.0 应用程序池,不同之处在于新应用程序池将使用新创建的域的 Identity帐户 MyDomain\webservice 而不是通常的 ApplicationPoolIdentity

    6. 在您的 Web 服务部署到的虚拟目录/站点的 Advanced Settings 选项上,更改 应用程序池 属性以使用新创建的应用程序池 WebServiceAppPool

    我相信这种设置更安全,并且它可以避免在连接字符串中硬编码用户 ID 和密码。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      消息清楚地表明:LOGIN FAILED .....用户(IIS APPPOOL\ASP.NET v4.0尝试连接到数据库没有权限。

      不知道任何其他细节,我假设这是一个托管在 IIS 中的 ASP.NET Web 应用程序/Web 服务,并且您很可能有一个连接到已打开 Integrated Security=SSPI 设置的数据库的连接字符串 - 因此,当前用户(这里是 IIS apppool 用户)尝试连接到数据库 - 但不能。

      所以更改您的连接字符串(请参阅 http://www.connectionstrings.com 上的大量示例)以指定 可以 连接的特定数据库用户:

      server=YourServer;database=YourDatabase;User ID=SomeValidUser;Pwd=Top$ecret
      

      【讨论】:

      • 我的连接字符串中有“Integrated Security=True”,把它变成False就够了?
      • 就我个人而言,我不喜欢包含密码的连接字符串。我会坚持集成安全性并在 SQL Server 方面对其进行整理,但这是我个人的看法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多