【问题标题】:How to implement ASP.NET identity: CREATE DATABASE permission denied in database 'master'如何实现 ASP.NET 身份:数据库“主”中的 CREATE DATABASE 权限被拒绝
【发布时间】:2015-08-07 02:50:53
【问题描述】:

首先,我已经在这里检查过: ASP.Net Identity how to set target DB?

我现在收到此错误

数据库“master”中的 CREATE DATABASE 权限被拒绝。

在这行代码上:

Dim user As User = manager.Find(Trim(Username.Text), Trim(Password.Text))

完全错误:

[SqlException (0x80131904): 数据库“主”中的 CREATE DATABASE 权限被拒绝。]
System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action1 wrapCloseInAction) +3249852
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +345
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4927
System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) +1287
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource
1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时,布尔型 asyncWrite)+367
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +386
System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch(TTarget target, Func3 操作,TInterceptionContext 拦截上下文,Action3 executing, Action3 执行)+965
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) +505
System.Data.Entity.SqlServer.c__DisplayClass1a.b__19(DbConnection conn) +136
System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action1 act) +347
System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action
1 act) +916
System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable1 commandTimeout, DbConnection sqlConnection, String createDatabaseScript) +117
System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable
1 commandTimeout, StoreItemCollection storeItemCollection) +212
System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection 连接) +172
System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase)+175
System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +116
System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func3 createMigrator, ObjectContext objectContext) +121
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +169
System.Data.Entity.CreateDatabaseIfNotExists
1.InitializeDatabase(TContext context) +257
System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) +72
System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() +483
System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input) +177
System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action
1 操作)+274
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +37
System.Data.Entity.Internal.Linq.InternalSet1.Initialize() +76
System.Data.Entity.Internal.Linq.InternalSet
1.get_InternalContext() +21
System.Data.Entity.Infrastructure.DbQuery1.System.Linq.IQueryable.get_Provider() +59
System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable
1 源,Expression1 predicate, CancellationToken cancellationToken) +208
System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable
1 源,Expression`1 谓词)+172

Microsoft.AspNet.Identity.EntityFramework.d__6c.MoveNext() +502
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+13855856
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61
Microsoft.AspNet.Identity.CultureAwaiter1.GetResult() +48
Microsoft.AspNet.Identity.<FindAsync>d__12.MoveNext() +357
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13855856
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
Microsoft.AspNet.Identity.AsyncHelper.RunSync(Func
1 func) +348
C:\MyApp\Login_identity.aspx.vb:168 中的 MyApp.Login_identity.UserLogin_Click(Object sender, EventArgs e)
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +11747645
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +150
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3360

我将AppModel.vb 中的DbContext 初始化更改为我现有的连接字符串conn1,它指向我已经转换为新标识表的SQL Server 数据库。

我的连接字符串:

<add name="conn1" 
     connectionString="data source=(local)\sqlexpress;Initial Catalog=myapp;User Id=sa;Password=XXXX;" 
     providerName="System.Data.SqlClient" />

AppModel.vb:

Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.EntityFramework
Imports System.Collections.Generic
Imports System.ComponentModel.DataAnnotations
Imports System.Data.Entity
Imports System.Linq
Imports System.Web

Namespace AspnetIdentitySample.Models
    Public Class ApplicationUser
        Inherits IdentityUser
        ' HomeTown will be stored in the same table as Users
        Public Property HomeTown() As String
            Get
                Return m_HomeTown
            End Get
            Set(value As String)
                m_HomeTown = Value
            End Set
        End Property
        Private m_HomeTown As String
        Public Overridable Property ToDoes() As ICollection(Of ToDo)
            Get
                Return m_ToDoes
            End Get
            Set(value As ICollection(Of ToDo))
                m_ToDoes = Value
            End Set
        End Property
        Private m_ToDoes As ICollection(Of ToDo) 

        ' FirstName & LastName will be stored in a different table called MyUserInfo
        Public Overridable Property MyUserInfo() As MyUserInfo
            Get
                Return m_MyUserInfo
            End Get
            Set(value As MyUserInfo)
                m_MyUserInfo = Value
            End Set
        End Property
        Private m_MyUserInfo As MyUserInfo 
    End Class

    Public Class MyUserInfo
        Public Property Id() As Integer
            Get
                Return m_Id
            End Get
            Set(value As Integer)
                m_Id = Value
            End Set
        End Property
        Private m_Id As Integer
        Public Property FirstName() As String
            Get
                Return m_FirstName
            End Get
            Set(value As String)
                m_FirstName = Value
            End Set
        End Property
        Private m_FirstName As String
        Public Property LastName() As String
            Get
                Return m_LastName
            End Get
            Set(value As String)
                m_LastName = Value
            End Set
        End Property
        Private m_LastName As String
    End Class

    Public Class ToDo
        Public Property Id() As Integer
            Get
                Return m_Id
            End Get
            Set(value As Integer)
                m_Id = Value
            End Set
        End Property
        Private m_Id As Integer
        Public Property Description() As String
            Get
                Return m_Description
            End Get
            Set(value As String)
                m_Description = Value
            End Set
        End Property
        Private m_Description As String
        Public Property IsDone() As Boolean
            Get
                Return m_IsDone
            End Get
            Set(value As Boolean)
                m_IsDone = Value
            End Set
        End Property
        Private m_IsDone As Boolean
        Public Overridable Property User() As ApplicationUser
            Get
                Return m_User
            End Get
            Set(value As ApplicationUser)
                m_User = Value
            End Set
        End Property
        Private m_User As ApplicationUser 
    End Class
    Public Class MyDbContext
        Inherits IdentityDbContext(Of ApplicationUser)
        Public Sub New()
            MyBase.New("conn1") 'DefaultConnection
        End Sub

        Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
            MyBase.OnModelCreating(modelBuilder)

            ' Change the name of the table to be Users instead of AspNetUsers
            modelBuilder.Entity(Of IdentityUser)().ToTable("Users")
            modelBuilder.Entity(Of ApplicationUser)().ToTable("Users")
        End Sub

        Public Property ToDoes() As DbSet(Of ToDo)
            Get
                Return m_ToDoes
            End Get
            Set(value As DbSet(Of ToDo))
                m_ToDoes = Value
            End Set
        End Property
        Private m_ToDoes As DbSet(Of ToDo)

        Public Property MyUserInfo() As DbSet(Of MyUserInfo)
            Get
                Return m_MyUserInfo
            End Get
            Set(value As DbSet(Of MyUserInfo))
                m_MyUserInfo = Value
            End Set
        End Property
        Private m_MyUserInfo As DbSet(Of MyUserInfo)
    End Class


End Namespace

更新

根据评论,我还检查了here

我真的不明白为什么这是一个角色问题,因为我正在重用一个已经可以很好地更新其他(非身份相关)表的连接字符串。我也不明白为什么错误是指master 表,因为我希望我不会尝试通过manager.Find 方法以任何方式连接到该表。

无论如何,我当前正在测试的用户已经分配给sysadmin 角色:

更新 2

好的,感谢 Jeremy 在下面的评论,我离我更近了一步……我需要将用户 IIS APPPOOL\.NET v4.5 添加到角色 sysadmin,因为那是 SQL Server 分析器中显示的连接用户(尽管我是不确定将此用户添加到此角色时的安全风险)。 无论如何,Find 方法不再抛出错误,并且使用 SQL Server 分析器我看到执行此代码时触发了 SQL 语句Dim user As User = manager.FindByName(Trim(Username.Text))

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[ApplicationId] AS [ApplicationId], 
[Extent1].[MobileAlias] AS [MobileAlias], 
[Extent1].[IsAnonymous] AS [IsAnonymous], 
[Extent1].[LastActivityDate] AS [LastActivityDate], 
[Extent1].[MobilePIN] AS [MobilePIN], 
[Extent1].[LoweredEmail] AS [LoweredEmail], 
[Extent1].[LoweredUserName] AS [LoweredUserName], 
[Extent1].[PasswordQuestion] AS [PasswordQuestion], 
[Extent1].[PasswordAnswer] AS [PasswordAnswer], 
[Extent1].[IsApproved] AS [IsApproved], 
[Extent1].[IsLockedOut] AS [IsLockedOut], 
[Extent1].[CreateDate] AS [CreateDate], 
[Extent1].[LastLoginDate] AS [LastLoginDate], 
[Extent1].[LastPasswordChangedDate] AS [LastPasswordChangedDate], 
[Extent1].[LastLockoutDate] AS [LastLockoutDate], 
[Extent1].[FailedPasswordAttemptCount] AS [FailedPasswordAttemptCount], 
[Extent1].[FailedPasswordAttemptWindowStart] AS [FailedPasswordAttemptWindowStart], 
[Extent1].[FailedPasswordAnswerAttemptCount] AS [FailedPasswordAnswerAttemptCount], 
[Extent1].[FailedPasswordAnswerAttemptWindowStart] AS [FailedPasswordAnswerAttemptWindowStart], 
[Extent1].[Comment] AS [Comment], 
[Extent1].[Email] AS [Email], 
[Extent1].[EmailConfirmed] AS [EmailConfirmed], 
[Extent1].[PasswordHash] AS [PasswordHash], 
[Extent1].[SecurityStamp] AS [SecurityStamp], 
[Extent1].[PhoneNumber] AS [PhoneNumber], 
[Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Extent1].[LockoutEnabled] AS [LockoutEnabled], 
[Extent1].[AccessFailedCount] AS [AccessFailedCount], 
[Extent1].[UserName] AS [UserName]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE ((UPPER([Extent1].[UserName])) = (UPPER(@p__linq__0))) OR ((UPPER([Extent1].[UserName]) IS NULL) AND (UPPER(@p__linq__0) IS NULL))',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'flo@outlook.com'

奇怪的是:当我直接在 SQL Server Management Studio 中执行它时,我会返回一条记录,但在我的代码中,变量 userNothing....它会是什么?

【问题讨论】:

  • Stacktrace 表明 ASP.Net 身份/实体框架尝试创建数据库。这是你所期望的吗?换句话说 - 数据库“myapp”是否已经存在于您的 sql 服务器上?
  • 这确实不是我所期望的。数据库 myapp 已经存在。就好像我这里传递的自定义数据库连接字符串被忽略了:Public Sub New() MyBase.New("conn1") 'DefaultConnection End Sub
  • 错误是指主数据库,而不是主表。
  • @StingyJack:master 数据库在做什么?我该如何解决这个问题?

标签: asp.net sql-server vb.net asp.net-identity


【解决方案1】:

如果您的应用程序池在 NETWORK SERVICE 身份下运行,请尝试此操作。然后为“NT AUTHORITY\NETWORK SERVICE”赋予系统管理员角色:

或者将 SysAdmin 分配给运行应用程序池的帐户。

如果这不起作用,请检查以下解决方案是否有帮助:CREATE DATABASE permission denied in database 'master' (EF code-first)

编辑:

为所有这些帐户提供 sysAdmin 并不是很安全。完成这项工作后,将 SQL 安全性收紧到仅 dbReader 和 dbWriter 角色。

FindByName 方法出了什么问题?

现在没有异常,问题是我认为没有返回数据 权限仍有问题。

由于您在连接字符串中使用 SQL 身份验证,您可以尝试使用 Windows Integrated 吗?否则,请尝试在连接字符串中使用 appPool IIS 帐户凭据,看看这是否会产生出什么问题的线索?

【讨论】:

  • 我将系统管理员角色添加到“NT AUTHORITY\NETWORK SERVICE”。但这并没有帮助......我在哪里可以看到哪个帐户正在运行应用程序池?顺便说一句,您提到的帖子并没有为我解决问题:(
  • 是时候了!!拉出我们的 SQL Server Profiler!并进行追踪,那里发生了什么?谁在执行 - 你知道,它被冒充了吗?让我们找出来!!!
  • 谢谢!我更近了一步,我已经更新了我的帖子(见更新 2)。如果你可以看看?添加此角色是否安全? FindByName 方法出了什么问题?
  • 您的更新在哪里?我没有看到任何新评论或更新答案?
  • 好的,我会尽快测试。无论如何,我现在都会奖励你赏金,否则它将过期,你的答案最接近解决这个问题:) 希望你能帮助我完全解决这个问题。谢谢!
【解决方案2】:

您的连接字符串包含“User Id=sa;Password=XXXX”,因此该连接正在尝试使用 SQL Server 身份验证。您的 SSMS 登录属性的标题栏似乎正在识别 Windows 帐户,这意味着应该使用 Windows 身份验证。然而,连接正在尝试使用 SQL Server 身份验证(而不是 Windows 身份验证)。如果尚未配置,可以更改 SQL Server 的身份验证模式以支持 SQL 身份验证和 Windows 身份验证(“混合模式”身份验证),请参阅https://msdn.microsoft.com/en-us/library/ms188670.aspx

或者,可以根据https://msdn.microsoft.com/en-us/library/jj653752(v=vs.110).aspx#integratedsecurity 更改连接字符串以使用 Windows 身份验证/集成安全性

【讨论】:

  • 不,不是这样...我已经为此服务器启用了 Windows 和 SQL Server 身份验证。用户 sa 已经拥有所有权限。还能是什么?
  • 将 CREATE DATABASE 语句替换为 SELECT USER。如果返回“dbo”,则您的登录名是 sysadmin 角色的成员。如果返回“dbo”以外的其他名称(包括“sa”),则您的帐户不是 sysadmin 角色的成员。如果返回“sa”,则很可能 sa 帐户已重命名并创建了一个名为“sa”的新帐户(并且新的“sa”帐户不是 syadmin 角色的成员)。系统管理员也应该可以拒绝自己或其他系统管理员帐户权限(b/c 访问被拒绝胜过所有),但系统管理员(又名 DBO 用户)可以删除该拒绝。
  • 好的,抱歉耽搁了,但我一直在想办法解决这个问题....我在哪里可以替换该语句?它被包裹在编译代码的某个地方,我猜想在manager.Find 方法后面。请指教....
  • 我认为您无法在设置中替换该语句。但是您可以使用连接字符串中的信息在 SSMS 中进行手动连接,以检查您的 sa 帐户是否正常。 IE。使用您的 sa 帐户通过 sql 身份验证连接到 management stuido。
【解决方案3】:

为什么要使用身份字段而不是在 NVARCHAR() 字段中使用 HASH 值?

例如:您可以从用户(或他的字段的连接)处获取单个数据,从 .NET 密码库计算 HASH 并将 NVARCHAR() 设置为数据。

通过这种方式(假设您使用 SHA-512 HASH),您将能够拥有单个数据的 Base64 字符串,例如身份本身。

但是,如果您的目标是momentum 的标识,您可以获取用户数据,加上当前日期时间,计算其 HASH 并将此数据保存为记录的标识。

【讨论】:

  • 我真的很想利用 Identity 框架提供的方法而不是变通方法。我不确定您所说的 have an identity to the momentum 是什么意思……这是什么意思?
  • 在我的 SQL 数据库中,我有一些记录必须以严格的格式反映一种基于日期和时间的身份:yyyymmddhhmmmss(如 20150904121752)。一些搜索是使用这种字符串进行的。我做什么?我将其转换为 HASH 并在 SQL 中找到 HASH 代码 - 一种时间戳。还要记住,身份可以在数据库清理/压缩例程中更改。
  • Remember also that Identity can change in a database clean/compression routines?您的意思是一般的 ASP.NET 身份框架?如果是这样:这意味着什么?
  • 这意味着在某些特定情况下您可能会有一种或重新排序,例如当您使用重新索引/收缩数据库时。我不记得确切的情况是,但我在过去使用它时遇到了一个巨大的问题。您可以尝试上述解决方案或创建一个 NVARCHAR 字段并将 IDENTITY 设置为选项(所有 NVARCHAR 字段都可以设置为 Identity)。但即使是最后一个,我想我过去也遇到过问题 - 因为它我使用了 HASHES。
  • 我不确定我们是否在谈论同一件事,但这份报告可能会对您有所帮助:sqlmag.com/t-sql/should-i-use-identity-or-not。抱歉,如果我没有在您需要的方面为您提供帮助。
【解决方案4】:

您可能应该使用与“sa”不同的 SQL 帐户,但 sa 的默认数据库是 master。即使 myapp 在连接字符串中定义,Find 方法也可能使用用户的默认数据库。

在此处将 sa 的默认数据库更改为 myapp:

【讨论】:

  • 您好,谢谢,但是用户 sa 的默认数据库已经设置为 myapp....仍然出现同样的错误。
【解决方案5】:

您的用户应该被添加到 dbcreator 角色中。

否则不允许创建新数据库。

Sysadmin/public 是不够的。

【讨论】:

  • 系统管理员没有创建数据库的权限?
  • 不,它没有。每次我忘记添加它时都会遇到这个问题。 :D
  • @IsmailHassani 谢谢,但是当我尝试将角色 'dbcreator' 添加到我的用户 'sa' 时,我收到错误 Cannot use the special principal 'sa',我发现他的帖子提到它已经是系统管理员的成员组,胜过所有其他组:stackoverflow.com/questions/14188629/… 那我该怎么办? (我尝试在以用户“sa”身份登录以及通过 Windows 身份验证时向该用户添加角色)
  • 实际上,这应该表明您可以从 Management Studio 创建一个新数据库。你试过这个吗?
  • Sysadmin 是访问权限最高的角色,可以在服务器上执行任何活动。 msdn.microsoft.com/en-us/library/ms188659(v=sql.105).aspx。开箱即用的“sa”用户已经隐式拥有 dbcreator,因此您的设置有其他问题。 SQL 或 Windows 事件日志中是否有任何消息?
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多