C# 如何通过IIS远程访问数据库?

C# 如何通过IIS远程访问数据库?,c#,asp.net,sql-server-2005,C#,Asp.net,Sql Server 2005,我已经将ASP.net与C#一起使用。我想通过web服务器访问SQL Server数据库。从开发区执行我的应用程序时,它正在工作,但将应用程序部署到IIS服务器后,它会显示以下异常: 在数据库“master”中创建数据库的权限被拒绝。企图 为文件D:\newtest\newtest.mdf附加自动命名数据库失败。 存在同名的数据库,或者无法创建指定的文件 已打开,或位于UNC共享上 我已使用以下连接字符串连接到数据库 Data Source = .\\SQLEXPRESS;AttachD

我已经将ASP.net与C#一起使用。我想通过web服务器访问SQL Server数据库。从开发区执行我的应用程序时,它正在工作,但将应用程序部署到IIS服务器后,它会显示以下异常:

在数据库“master”中创建数据库的权限被拒绝。企图 为文件D:\newtest\newtest.mdf附加自动命名数据库失败。 存在同名的数据库,或者无法创建指定的文件 已打开,或位于UNC共享上

我已使用以下连接字符串连接到数据库

    Data Source = .\\SQLEXPRESS;AttachDbFileName=databasepath; Integrated Security=true

如何通过IIS远程访问SQL Server数据库?

他们使用SQL Server创建凭据并更新配置文件

connectionString="Data Source=Abcl\SQLEXPRESS;Initial Catalog=master;User ID=sa;Password=pwd12" providerName="System.Data.SqlClient"
如果您使用的是像mdf这样的db文件 请像这样使用

connectionString="AttachDbFilename='C:\Documents and Settings\nmartin\My Documents\PS_Upload\TimeTrack\src\TimeTracker\TimeTrack\App_Data\ASPNETDB.MDF';Integrated Security=True; User Instance=True" 

尽管桑杰的回答是正确的,但这并不能真正解释为什么你的许可被拒绝

在ASP.NET/IIS中运行的代码作为特定用户运行,如辅助进程的配置中所述。对于IIS 6[Server 2003](以及以下版本,我认为)IIS 7+[Server 2008]的默认行为是
NETWORK SERVICE
,默认行为是作为特殊的应用程序池用户
iisappool\yourAppPoolName
运行

如果您为正确的用户帐户在数据库上授予必要的权限,那么您应该能够避免错误,并且仍然使用集成安全性


另一方面,通常最好对数据库授予最严格(但仍然可操作)的权限集<代码>创建数据库需要相当高的权限级别(我不记得我脑子里想的是什么)。如果您将此权限授予IIS应用程序,您将面临一个巨大的风险,即允许一个不太体面的用户控制您的数据库系统并对其造成严重破坏

关键是您在连接字符串中使用了
integratedsecurity=True

在开发环境中运行项目时,web应用程序通常作为本地用户帐户运行。此外,您的帐户通常是本地SQL实例上的特权用户(管理员)

在部署服务器上,IIS通常作为本地计算机帐户(或为应用程序池配置的帐户)运行。该帐户在SQL server Instance上通常没有任何特权

正如debracey所指出的,您通常不希望应用程序的SQL权限高到足以造成任何伤害(即使这是您的一个诚实错误)。避免TIH的一种常见模式是为应用程序设置两个单独的SQL帐户:

  • 用于创建和修改数据库schmea的高权限帐户(例如db_所有者角色)
  • 在应用程序运行时访问数据库的有限权限帐户(例如,db_datareader和/或db_datawriter角色)

  • 在我的应用程序中没有固定的数据库文件,我每次都会更改数据库,我在项目文件夹中传递了一个文件文件包含数据库路径,阅读此文件中的数据库路径如何在web.config中每次传递数据库路径&我在类文件中使用了此连接字符串&如何在ASP.NET中无用户ID访问数据库我已根据您的要求更新了答案。。。请检查我将不得不建议使用
    sa
    是一个不好的示例。@Aaron Bertrand只是一个示例,当然,我必须创建自己的用户名和密码,并具有指定数据库的权限,以便用于指定的应用程序请查看我的连接字符串与您的连接字符串相同,我已经直接在类文件中写了这个,而不是在web.config中