【问题标题】:Why are my MVC 4 Authorize checks throwing an exception?为什么我的 MVC 4 授权检查会引发异常?
【发布时间】:2013-02-12 02:01:55
【问题描述】:

我正在使用带有 SQL Server Express 2012 的 Visual Studio 2012。我使用“Internet 应用程序”模板创建了一个 MVC 4 Web 应用程序。

我想在我的 SQL Server 2012 Express 实例上使用现有数据库(而不是模板的 MDF)。我已修改我的 web.config 以指向我的本地 SQL express 实例,并删除了模板生成的 MDF。我的 Web.Config 有:

<add name="DefaultConnection" 
    connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Administration;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>

股票会员代码有一个初始化DB的调用:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

一旦应用程序启动,表就会在管理数据库中创建,正如我所期望的那样。我可以创建用户并在管理中填充它们。我可以通过代码填充角色表并将角色添加到用户的配置文件并验证它是否已完成。例如:

Roles.GetRolesForUser("kristian"); // = string[] { "Administrator" }

但如果我尝试使用基于角色的授权,例如:

[Authorize(Roles = "Administrator")]

我得到以下异常:

Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.

它给出了一个很长的讨厌的堆栈跟踪,让我觉得它仍在尝试创建一个 MDF 文件:

[SqlException (0x80131904):由于启动用户实例进程失败,无法生成 SQL Server 的用户实例。连接将被关闭。] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection,Action1 wrapCloseInAction) +5295167 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +69 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +30 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +317 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +889 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) +434 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +5309659 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) +38 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1重试,DbConnectionOptions userOptions,DbConnectionInternal&连接)+5311874 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) +143 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry) +83 System.Data.SqlClient.SqlConnection.Open() +96 System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trust, String connectionString) +76

[HttpException (0x80004005): 无法连接到 SQL Server 数据库。] System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trust, String connectionString) +131 System.Web.Management.SqlServices.SetupApplicationServices(字符串服务器、字符串用户、字符串密码、布尔可信、字符串连接字符串、字符串数据库、字符串 dbFileName、SqlFeatures 功能、布尔安装)+89 System.Web.Management.SqlServices.Install(字符串数据库,字符串 dbFileName,字符串连接字符串)+27 System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) +386

这束快乐底部的行让我觉得它与现在删除的 MDF('System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile')有关。我在这方面是正确的吗?还是只是模板实现的授权不完整?

如果其他人已经处理过这个问题或知道我的属性使用失败的原因,我将非常感谢您的帮助。

【问题讨论】:

  • 您是否尝试在整个解决方案(Ctrl Shift F)中搜索“MDF”并替换?

标签: asp.net-mvc asp.net-mvc-4 forms-authentication


【解决方案1】:

我遇到了同样的问题。它似乎与未正确初始化 SimpleMembership 有关。尝试确保使用[InitializeSimpleMembership] 或直接调用Database.SetInitializer&lt;UsersContext&gt;(null);

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2020-03-23
    • 2013-01-31
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多