System.Data.SqlClient.SqlException:用户登录失败

在调试中使用我的项目我没有问题。 但是在IIS中运行它我收到此错误:

System.Data.SqlClient.SqlException:用户’domain \ name-PC $’登录失败。

堆栈跟踪

[SqlException (0x80131904): Login failed for user 'CAPLUGSLLC\OETINGER-PC$'.] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +6749670 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +815 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4515 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +84 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +53 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +368 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +6777754 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +6778255 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +878 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +1162 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +72 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +6781425 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +103 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +2105 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +116 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +1089 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +6785863 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +233 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +278 System.Data.SqlClient.SqlConnection.Open() +239 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) +65 System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() +38 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() +30 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +81 System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() +54 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +446 System.Linq.Enumerable.ToList(IEnumerable`1 source) +80 MvcMobile.Controllers.HomeController.Index() +38 lambda_method(Closure , ControllerBase , Object[] ) +79 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +261 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 System.Web.Mvc.Async.c__DisplayClass42.b__41() +34 System.Web.Mvc.Async.c__DisplayClass39.b__33() +124 System.Web.Mvc.Async.c__DisplayClass4f.b__49() +839035 System.Web.Mvc.Async.c__DisplayClass37.b__36(IAsyncResult asyncResult) +15 System.Web.Mvc.Async.c__DisplayClass2a.b__20() +33 System.Web.Mvc.Async.c__DisplayClass25.b__22(IAsyncResult asyncResult) +839620 System.Web.Mvc.c__DisplayClass1d.b__18(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +15 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +65 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +15 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +51 System.Web.Mvc.c__DisplayClass8.b__3(IAsyncResult asyncResult) +42 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +15 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288 

我可以通过Google找到的首要解决方案是更改不起作用的应用程序池高级身份设置。

我正在使用IIS 7.5,我连接到SQLServer 2012,我的连接字符串在下面。

连接字符串

  

假设您打算使用Windows身份validation来模拟服务帐户,则必须在IIS和ASP.NET中设置Windows身份validation。

在IIS中,确保添加并启用了Windows身份validation模块。 还要确保您的应用程序池在域帐户下运行,而不是在本地帐户下运行。

在ASP.NET中,确保将身份validation模式属性设置为“Windows”

    

只需设置Integrated Security=False就可以了,根据TrueFalse之间的注释差异是:

True忽略User IDPassword如果提供)并使用正在运行的进程, SSPI(Security Support Provider Interface ) ,如果提供它将使用它们,这就是MS更喜欢这个的原因。 它们是等效的,因为它们使用相同的安全机制进行身份validation,但就是这样。

如果您的SQL Server尚未配置为使用混合模式身份validation,您也可能会收到此错误 – 它实际上并未告诉您未启用此function!

我有类似的经历,我花了很多时间来解决问题。 虽然,我自己的情况是ASP.Net MVC CoreCore框架。 设置Trusted_Connection=False; 解决了我的问题。

appsettings.json文件中

 "ConnectionStrings": { "DefaultConnection": "Server=servername; Database=databasename; User Id=userid; Password=password; Trusted_Connection=False; MultipleActiveResultSets=true", }, 

Numpty在这里使用SQL身份validation

在此处输入图像描述

而不是Windows(正确)

在此处输入图像描述

将登录添加到SQL Server时,如果您使用的是Windows身份validation,也会出现此错误。

我刚刚遇到这个错误,需要几天才能解决。 我们被初始问题中提到的red-herring错误消息抛出一个循环,加上Windows事件查看器错误日志表明类似的东西:

 Login failed for user '(domain\name-PC)$'. Reason: Could not find a login matching the name provided. [CLIENT: ] 

这些都不是真的,用户拥有SQL Server中的所有必要权限。

在我们的示例中,解决方案是将IIS中的应用程序池标识切换到NetworkService