C# “无法打开数据库”;测试“;由登录请求。登录失败。用户登录失败';xyz\ASPNET';

C# “无法打开数据库”;测试“;由登录请求。登录失败。用户登录失败';xyz\ASPNET';,c#,asp.net,sql-server,iis,web-services,C#,Asp.net,Sql Server,Iis,Web Services,我已经创建了一个web服务,它正在将一些数据保存到db中。但我得到了这个错误: 无法打开登录请求的数据库“测试”。登录失败。用户“xyz\ASPNET”登录失败 我的连接字符串是 Data Source=.\SQLExpress;Initial Catalog=IFItest;Integrated Security=True 这个错误很明显,不是吗?您正在尝试使用用户“xyz/ASPNET”连接到SQL Server,这是您的ASP.NET应用程序正在运行的帐户 不允许此帐户连接到SQL Se

我已经创建了一个web服务,它正在将一些数据保存到db中。但我得到了这个错误:

无法打开登录请求的数据库“测试”。登录失败。用户“xyz\ASPNET”登录失败

我的连接字符串是

Data Source=.\SQLExpress;Initial Catalog=IFItest;Integrated Security=True

这个错误很明显,不是吗?您正在尝试使用用户“xyz/ASPNET”连接到SQL Server,这是您的ASP.NET应用程序正在运行的帐户

不允许此帐户连接到SQL Server-请在SQL Server上为该帐户创建登录名,或者在连接字符串中指定另一个有效的SQL Server帐户

您可以(通过更新原始问题)向我们显示您的连接字符串吗

更新:好的,您正在使用集成Windows身份验证-->您需要在SQL Server上为“xyz\ASPNET”创建SQL Server登录-或者将连接字符串更改为类似以下内容:

connectionString="Server=.\SQLExpress;Database=IFItest;User ID=xyz;pwd=top$secret"

如果您的数据库中有密码为“top$secret”的用户“xyz”。

最好的选择是使用Windows集成身份验证,因为它比sql身份验证更安全。在sql server中创建具有必要权限的新windows用户,并在应用程序池安全设置中更改IIS用户。

  • “xyz\ASPNET”不是登录名(在sys.server\u主体中)
  • 或者:“xyz\ASPNET”已设置,但未映射到数据库测试中的用户(sys.database_principals)
我选择第二个选项:错误消息意味着默认数据库要么不存在,要么没有权限,而不是没有设置为登录

测试是否设置为登录

SELECT SUSER_ID('xyz\ASPNET') -- (**not** SUSER_SID)
如果为空

CREATE LOGIN [xyz\ASPNET] FROM WINDOWS
USE test
GO
CREATE USER [xyz\ASPNET] FROM LOGIN [xyz\ASPNET]
如果不为空

USE test
GO
SELECT USER_ID('xyz\ASPNET')
如果为空

CREATE LOGIN [xyz\ASPNET] FROM WINDOWS
USE test
GO
CREATE USER [xyz\ASPNET] FROM LOGIN [xyz\ASPNET]

登录问题的最佳解决方案是在sqlServer中创建一个登录用户。以下是创建使用Windows身份验证(SQL Server Management Studio)的SQL Server登录的步骤:

  • 在SQL Server Management Studio中,打开对象资源管理器并展开的文件夹 要在其中创建新登录名的服务器实例
  • 右键单击安全文件夹,指向“新建”,然后单击“登录”
  • 在“常规”页面的“登录名”框中输入Windows用户的名称
  • 选择Windows身份验证
  • 单击“确定”
  • 例如,如果用户名是
    xyz\ASPNET
    ,则在登录名框中输入此名称


    您还需要更改用户映射以允许访问您想要访问的数据库。

    我发现在创建新登录时还必须设置UserMapping选项,这为我解决了问题。希望这能帮助那些也被困在这里的人


    编辑:将登录名设置为db owner也解决了下一个问题

    我尝试更新用户,结果成功了。请参见下面的命令

    USE ComparisonData// databaseName
    EXEC  sp_change_users_login @Action='update_one', @UserNamePattern='ftool',@LoginName='ftool';
    

    只需相应地替换
    user('ftool')

    我在之前的问题中没有提到过这一点,所以让我抛出另一种可能性。可能是
    IFItest
    无法访问或根本不存在。例如,如果有多个配置,每个配置都有自己的数据库,则可能是数据库名称没有更改为当前配置的正确名称

    如果您在另一台sql server中打开此数据库(例如,启动sql Management studio(SMS)并添加此数据库),而忘记停止此服务器,有时可能会出现此问题。结果-您的应用程序尝试与另一台服务器下已连接在此数据库中的用户连接。要解决此问题,请尝试通过配置停止此服务器。调度程序sql server

    我对英语不好表示歉意。
    问候您,Ignat。

    大多数情况下,这不是登录问题,而是创建数据库本身的问题。因此,如果在创建数据库时出错,则首先不会创建数据库。在这种情况下,如果您尝试登录,无论用户是谁,登录都将失败。这通常是由于对数据库上下文的逻辑错误解释造成的

    在浏览器中访问站点并真正阅读这些错误日志,这可以帮助您发现代码中的问题(通常是模型中的冲突逻辑问题)


    在我的例子中,代码编译得很好,同样的登录问题,当我还在下载management studio时,我检查了错误日志,修复了我的db上下文约束,网站开始运行良好……与此同时,management studio还在下载,我遇到了这个问题,解决这个问题的方法是:

    • 转到IIS中的应用程序池
    • 右键单击我的项目应用程序池
    • 进程内模型部分打开标识
    • 选择自定义帐户选项
    • 输入您的电脑用户名和密码
      • 这对我很有用

      • 转到SQL Server>>安全>>登录,右键单击NT AUTHORITY\NETWORK SERVICE并选择属性
      • 在新打开的登录属性屏幕中,转到“用户映射”选项卡
      • 然后,在“用户映射”选项卡上,选择所需的数据库–尤其是显示此错误消息的数据库
      • 单击“确定”
      • 阅读这个博客


        我使用Windows身份验证连接到本地数据库.mdf文件和 我的本地服务器是sql server 2014。 使用此连接字符串解决了我的问题:

        string sqlString = " Data Source = (LocalDB)\\MSSQLLocalDB;" + "AttachDbFilename = F:\\.........\\myDatabase.mdf; Integrated Security = True; Connect Timeout = 30";
        

        在我的例子中,asp.net应用程序通常可以毫无问题地连接到数据库。我在日志中注意到这样的信息。我和我发现了这条信息:

        2016-10-28 10:27:10.86 Logon       Login failed for user '****'. Reason: Failed to open the explicitly specified database '****'. [CLIENT: <local machine>]
        2016-10-28 10:27:13.22 Server      SQL Server is terminating because of a system shutdown. This is an informational message only. No user action is required.
        
        2016-10-28 10:27:10.86用户“*****”登录失败。原因:无法打开显式指定的数据库“**”。[客户:]
        2016-10-28 10:27:13.22服务器SQL Server因系统关闭而终止。这只是一条信息性消息。不需要用户操作。
        
        所以,似乎服务器正在重新启动,SQL server在ASP.NET应用程序和数据库关闭之前关闭了一点
        System.Data.SqlClient.SqlException (0x80131904): 
        Cannot open database "MyDbName" requested by the login. The login failed.
        Login failed for user 'MYDOMAINNAME\HOSTNAME$'.
        
        USE MASTER;
        EXEC sp_who2
        
        USE MASTER;
        ALTER DATABASE [my_db] SET MULTI_USER
        GO
        
        update-database
        
        Tools-> Nuget Package Manager -> Package Manager console