Подтвердить что ты не робот

Как реализовать идентификатор ASP.NET: разрешить CREATE DATABASE в базе данных "master"

Прежде всего, я уже проверил здесь: Идентификация ASP.Net как установить целевую БД?

Теперь я получаю эту ошибку

Разрешить CREATE DATABASE в базе данных "master".

В этой строке кода:

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

Полная ошибка:

[SqlException (0x80131904): разрешено разрешение CREATE DATABASE в базе данных "master".]
System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, Boolean breakConnection, Action 1 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 завершение, String methodName, логический sendToPipe, тайм-аут Int32, логический asyncWrite) +367
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +386
System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch(TTarget target, Func 3 операция, TInterceptionContext interceptionContext, Action 3 executing, Action 3 выполнено) +965
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(команда DbCommand, DbCommandInterceptionContext interceptionContext) +505
System.Data.Entity.SqlServer. < > c__DisplayClass1a.b__19 (DbConnection conn) +136
System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, действие 1 act) +347
System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action
1 действие) +916
System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable 1 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(действие необходимо для использования в базе данных ToKeepDatabase) +175
System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +116
System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func 3 createMigrator, ObjectContext objectContext) +121
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +169
System.Data.Entity.CreateDatabaseIfNotExists
1.InitializeDatabase(контекст TContext) +257
System.Data.Entity.Internal.InternalContext.PerformInitializationAction(действие действия) +72
System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() +483
System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) +177
System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action
1 действие) +274
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Тип entityType) +37
System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() +76
System.Data.Entity.Internal.Linq.InternalSet
1.get_InternalContext() +21
System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() +59
System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable
1 источник, выражение 1 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.CultureAwaiter 1.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
MyApp.Login_identity.UserLogin_Click (отправитель объекта, EventArgs e) в C:\MyApp\Login_identity.aspx.vb: 168
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

Я изменил инициализацию DbContext в AppModel.vb на мою существующую строку подключения 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

UPDATE

На основании комментария я также проверил здесь.

Я действительно не понимаю, почему это проблема с ролью, поскольку я повторно использую строку соединения, которая уже отлично работает с обновлением других таблиц (не связанных с идентификацией). Также я не понимаю, почему ошибка относится к таблице master, так как я ожидаю, что я не пытаюсь каким-либо образом подключиться к ней с помощью метода manager.Find.

В любом случае пользователь, через который я сейчас тестирую, уже назначен роли sysadmin:

введите описание изображения здесь

ОБНОВЛЕНИЕ 2

Хорошо, спасибо за комментарий Джереми ниже. Я на шаг ближе... Мне нужно было добавить пользователя 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'[email protected]'

Странная вещь: когда я выполняю ее непосредственно в SQL Server Management Studio, я получаю запись, но в моем коде переменная user равна Nothing.... Что это может быть?

4b9b3361

Ответ 1

Строка подключения содержит "User Id = sa; Password = XXXX", поэтому соединение пытается использовать проверку подлинности SQL Server. Ваша строка заголовка входа в систему SSMS, по-видимому, идентифицирует учетную запись Windows, а это значит, что предполагается, что Windows Authentication следует использовать. И все же соединение пытается использовать аутентификацию SQL Server (а не проверку подлинности Windows). Если он еще не настроен, режим проверки подлинности SQL Server может быть изменен для поддержки аутентификации SQL и аутентификации Windows (аутентификация в смешанном режиме), см. https://msdn.microsoft.com/en-us/library/ms188670.aspx,

В качестве альтернативы, строка подключения может быть изменена для использования аутентификации Windows/интегрированной безопасности, за https://msdn.microsoft.com/en-us/library/jj653752(v=vs.110).aspx#integratedsecurity

Ответ 2

Попробуйте, если ваш пул приложений работает под идентификатором NETWORK SERVICE. Затем укажите роль SysAdmin для "NT AUTHORITY\NETWORK SERVICE":

введите описание изображения здесь

Или предоставить SysAdmin, для которого когда-либо выполнялась учетная запись, запускающая пул приложений.

Если это не сработает, проверьте, помогли ли какие-либо из этих решений: Разрешить CREATE DATABASE в базе данных 'master' (сначала код EF)

Edit:

Не очень безопасно давать все эти учетные записи sysAdmin. После того, как вы получите эту работу, затяните безопасность SQL только для ролей dbReader и dbWriter.

И что происходит с методом FindByName?

Теперь нет исключения, и проблема в том, что данные не возвращаются. Я думаю все еще есть что-то, что происходит с разрешениями.

Поскольку вы используете аутентификацию SQL в строке подключения, можете ли вы попробовать ее с помощью Windows Integrated? В противном случае попробуйте использовать учетные данные учетных записей appPool IIS в строке подключения и посмотрите, дает ли это ключ к неправильному?

Ответ 3

Почему вместо использования поля идентификатора вы не используете значение HASH в поле NVARCHAR()?

Например: вы можете получить отдельные данные от пользователя (или присоединиться к его полям), вычислить HASH из библиотеки .NET Cryptography и установить данные NVARCHAR() с данными.

Таким образом (и предположим, что вы используете SHA-512 HASH), вы сможете иметь строку Base64 отдельных данных, например, сам идентификатор.

Но если ваша цель имеет идентичность с импульсом, вы можете получить данные пользователя, а также текущее время и время, рассчитать его HASH и сохранить эти данные в качестве идентификатора записи.

Ответ 4

Вероятно, вы должны использовать другую учетную запись SQL, чем "sa", но база данных по умолчанию для sa - это мастер. Метод Find скорее всего использует базу данных по умолчанию для пользователя, хотя myapp определен в строке соединения.

Измените базу данных по умолчанию для sa на myapp, здесь:

введите описание изображения здесь

Ответ 5

Пользователь должен быть добавлен к роли dbcreator.

В противном случае вам не разрешено создавать новые базы данных.

Sysadmin/public недостаточно.