0

我编写了一个与 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

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

4

3 回答 3

3

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。

于 2011-05-29T11:33:10.790 回答
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中,展开您的<server name>节点并单击Application Pools

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

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

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

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

希望有帮助。

于 2011-05-29T12:45:17.007 回答
0

该消息清楚地说明了它: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
于 2011-05-29T11:33:17.683 回答