2015-08-07 2 views
11

Zunächst einmal Ich habe schon hier: ASP.Net Identity how to set target DB?Wie ASP.NET Identität implementieren: CREATE DATABASE-Berechtigung in der Datenbank 'Master' verweigert

ich jetzt

CREATE DATABASE permission denied in database 'master'.

Auf diesen Fehler diese Codezeile:

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

Voll Fehler:

[SqlException (0x80131904): CREATE DATABASE permission denied in database 'master'.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, 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 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +367
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +386
System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch(TTarget target, Func 3 operation, TInterceptionContext interceptionContext, Action 3 executing, Action 3 executed) +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, Action 1 act) +347
System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action
1 act) +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 connection) +172
System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) +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 context) +257
System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) +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 action) +274
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type 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 source, Expression 1 predicate, CancellationToken cancellationToken) +208
System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable
1 source, Expression`1 predicate) +172

Microsoft.AspNet.Identity.EntityFramework.d__6c.MoveNext() +502
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +13855856
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +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(Object sender, EventArgs e) in 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

Ich habe die DbContext Initialisierung in AppModel.vb in meine vorhandene Verbindungszeichenfolge conn1 geändert, die auf die SQL Server-Datenbank verweist, die ich bereits in die neuen Identitätstabellen konvertiert habe.

Meine Verbindungszeichenfolge:

<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

auf einen Kommentar Basierend Ich habe auch here.

Ich verstehe nicht wirklich, warum dies ein Rollenproblem ist, da ich eine Verbindungszeichenfolge wiederverwende, die bereits mit der Aktualisierung anderer (nicht identitätsbezogener) Tabellen funktioniert. Auch bekomme ich nicht, warum der Fehler auf die master Tabelle verweist, da ich erwarte, dass ich nicht versuche, in irgendeiner Weise durch die manager.Find Methode eine Verbindung herzustellen.

Wie dem auch sei, der Benutzer, durch die ich zur Zeit testen bin bereits auf die sysadmin Rolle zugewiesen:

enter image description here

UPDATE 2

Ok, dank Jeremy Kommentar unten Ich bin ein Schritt näher ... Ich musste Benutzer IIS APPPOOL\.NET v4.5 zu Rolle sysadmin hinzufügen, denn das war die Verbindung des Benutzers wie in SQL Server-Profiler gezeigt (obwohl ich unsicher bin über die Sicherheitsrisiken beim Hinzufügen dieses Benutzers zu dieser Rolle). Wie auch immer, nicht die Methode Suchen länger einen Fehler und mithilfe von SQL Server Profiler ich die SQL-Anweisung ausgelöst, wenn ich diesen Code ausführen 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]' 

Das Merkwürdige ist: wenn ich es direkt in SQL Server Management ausführen Studio bekomme ich einen Datensatz zurück, aber in meinem Code ist die Variable userNothing .... Was kann es sein?

+0

http://blog.techdreams.org/2007/11/create-database-permission-denied-sql.html https: //menononnet.wordpress.com/2011/03/07/create-datenbankberechtigung-verweigert-in-datenbankmaster-microsoft-sql-server-error-262/ –

+0

Stacktrace zeigt an, dass ASP.Net Identity/Entity Framework versucht, eine Datenbank zu erstellen. Ist das, was Sie erwarten würden? Mit anderen Worten - existiert die Datenbank "myapp" bereits auf Ihrem SQL-Server? – larsts

+0

Es ist tatsächlich NICHT, was ich erwarten würde. Die Datenbank myapp existiert bereits. Es ist so, als ob die benutzerdefinierte Datenbankverbindungszeichenfolge, die ich hier verlasse, ignoriert wird: 'Public Sub New() MyBase.New (" conn1 ") 'DefaultConnection End Sub' – Flo

Antwort

1

Ihre Verbindungszeichenfolge enthält "Benutzer-ID = sa; Kennwort = XXXX", daher versucht diese Verbindung die SQL Server-Authentifizierung zu verwenden. Die Titelleiste Ihrer SSMS-Anmeldungseigenschaft scheint ein Windows-Konto zu identifizieren, was impliziert, dass die Windows-Authentifizierung verwendet werden sollte. Und dennoch versucht die Verbindung die SQL Server-Authentifizierung (nicht die Windows-Authentifizierung) zu verwenden.Wenn nicht bereits konfiguriert, kann der SQL Server-Authentifizierungsmodus so geändert werden, dass er sowohl die SQL-Authentifizierung als auch die Windows-Authentifizierung unterstützt ("Mixed Mode" -Authentifizierung), siehe https://msdn.microsoft.com/en-us/library/ms188670.aspx.

Alternativ kann die Verbindungszeichenfolge geändert werden, um Windows-Authentifizierung zu verwenden/integrierte Sicherheit, pro https://msdn.microsoft.com/en-us/library/jj653752(v=vs.110).aspx#integratedsecurity

+0

Nein, das ist es nicht ... Ich habe bereits sowohl die Windows- als auch die SQL Server-Authentifizierung für diesen Server aktiviert. Benutzer sa hat alle Berechtigungen bereits. Was kann es noch sein? – Flo

+0

Ersetzen Sie die Anweisung CREATE DATABASE durch SELECT USER. Wenn 'dbo' zurückgegeben wird, ist Ihre Anmeldung ein Mitglied der sysadmin-Rolle. Wenn ein anderer Name als 'dbo' zurückgegeben wird (einschließlich 'sa'), ist Ihr Konto kein Mitglied der sysadmin-Rolle. Wenn 'sa' zurückgegeben wird, ist es wahrscheinlich, dass das sa-Konto umbenannt wurde und ein neues Konto mit dem Namen 'sa' erstellt wurde (und das neue Konto 'sa' ist kein Mitglied der syadmin-Rolle). Es sollte auch möglich sein, dass ein Sysadmin sich selbst oder einem anderen Sysadmin-Konto Berechtigungen verweigert (b/c-Zugriff verweigert alle trump), aber ein Sysadmin (auch DBO-Benutzer genannt) kann diesen verweigern entfernen. – Bill

+0

Ok Entschuldigung für die Verzögerung, aber ich habe versucht, das herauszufinden .... wo kann ich diese Aussage ersetzen? Es ist irgendwo in kompiliertem Code verpackt, denke ich hinter der 'manager.Find' Methode. Bitte Beratung .... – Flo

-1

Ihre Benutzer auf die Dbcreator Rolle hinzugefügt werden soll.

Andernfalls dürfen Sie keine neuen Datenbanken erstellen.

Sysadmin/public sind nicht genug.

+2

Sysadmin ist nicht berechtigt, Datenbanken zu erstellen? – StingyJack

+0

Nein, tut es nicht. Ich hatte dieses Problem jedes Mal, wenn ich vergessen habe, es hinzuzufügen. : D –

+0

@IsmailHassani Danke, aber wenn ich versuche, meinem Benutzer die Rolle 'dbcreator' hinzuzufügen 'sa' bekomme ich den Fehler 'Kann nicht das spezielle Prinzipal 'sa'' verwenden, ich fand seinen Beitrag, der erwähnt, dass es bereits Mitglied ist die Sysadmin-Gruppe, die alle anderen Gruppen übertrumpft: http://StackOverflow.com/Questions/14188629/Cannot-use-the-Special-Principal-SA Was kann ich also tun? (Ich habe versucht, diesem Benutzer sowohl bei der Anmeldung als Benutzer 'sa' als auch über die Windows-Authentifizierung Rollen hinzuzufügen) – Flo

1

Versuchen Sie dies, wenn Ihr Anwendungspool unter einer NETWORK SERVICE-Identität ausgeführt wird. Dann Rolle geben SysAdmin für „NT AUTHORITY \ NETWORK SERVICE“:

enter image description here

Oder geben SysAdmin, auf die je den app-Pool-Konto ausgeführt wird.

Wenn das nicht funktioniert, überprüfen Sie, ob jede dieser Lösungen helfen: CREATE DATABASE permission denied in database 'master' (EF code-first)

Edit:

Es ist nicht sehr sicher alle diese Konten Sysadmin zu geben. Nachdem Sie diese Funktion erhalten haben, straffen Sie die SQL-Sicherheit auf die Rollen dbReader und dbWriter.

And what is going wrong with the FindByName method?

Jetzt gibt es keine Ausnahme, und das Problem ist, dass keine Daten zurückgegeben Ich denke, gibt es immer noch mit Berechtigungen etwas los.

Da Sie SQL-Authentifizierung in der Verbindungszeichenfolge verwenden, können Sie es mit Windows Integrated versuchen? Versuchen Sie andernfalls, die Anmeldedaten von appPool IIS accounts in Ihrer Verbindungszeichenfolge zu verwenden, um zu sehen, ob das einen Hinweis darauf liefert, was falsch ist?

+0

Ich habe die Rolle sysadmin zu "NT AUTHORITY \ NETWORK SERVICE" hinzugefügt. Aber es hat nicht geholfen ... Wo sehe ich, auf welchem ​​Konto der Anwendungspool läuft? Der Beitrag, auf den du dich beziehst, löste es nicht für mich btw :( – Flo

+1

ITs TIME !! Um unseren SQL Server Profiler zu ziehen! Und eine Spur tun, was in dort geschieht? Wer führt aus - Sie wissen, wird es imitiert? Lässt finde es heraus! –

+0

Danke! Ich bin einen Schritt näher, ich habe meinen Beitrag aktualisiert (siehe Update 2). Wenn Sie einen Blick haben könnten? Ist es sicher, diese Rolle hinzuzufügen? Und was ist falsch mit dem FindByName Methode? – Flo

0

Warum verwenden Sie stattdessen ein HASH-Wert in einem NVARCHAR() - Feld, um ein Identitätsfeld zu verwenden?

Zum Beispiel: Sie können eine individuelle Daten vom Benutzer (oder ein Join seiner Felder), berechnen Sie eine HASH von .NET Cryptography-Bibliothek und setzen Sie diese NVARCHAR() mit den Daten.

Auf diese Weise (und unter der Annahme, dass Sie SHA-512 HASH verwenden) werden Sie in der Lage sein, eine Base64-Zeichenfolge aus einzelnen Daten, wie eine Identität selbst, zu haben.

Aber wenn Ihr Ziel eine Identität mit Momentum haben, können Sie die Benutzerdaten, zuzüglich der aktuellen Datetime, berechnen Sie seine HASH und speichern Sie diese Daten als die Identität des Datensatzes.

+0

Ich möchte wirklich die Methoden verwenden, die vom Identity Framework zur Verfügung gestellt werden, anstatt Workarounds. Ich bin mir nicht sicher, was du mit "Identität zum Schwung" meinst, aber ... was bedeutet das? – Flo

+0

In meiner SQL-Datenbank habe ich einige Datensätze, die eine Art von Identität basierend auf Datum und Uhrzeit in einem starren Format widerspiegeln müssen: yyyymmddhhmmmss (wie 20150904121752). Einige Suchvorgänge werden unter Verwendung dieser Art von Zeichenfolge durchgeführt. Was ich mache? Ich konvertiere es in HASH und finde den HASH-Code in SQL - eine Art Zeitstempel. Denken Sie auch daran, dass Identity sich in einer Datenbank Clean/Compression-Routinen ändern kann. –

+0

'Denken Sie auch daran, dass Identity in einer Datenbank Clean/Compression-Routinen ändern kann? Du meinst generell mit dem ASP.NET Identity Framework? Wenn ja: Was bedeutet das? – Flo

0

Sie sollten wahrscheinlich ein anderes SQL-Konto als "sa" verwenden, aber die Standarddatenbank für sa ist Master. Die Find-Methode verwendet wahrscheinlich die Standarddatenbank für den Benutzer, obwohl myapp in der Verbindungszeichenfolge definiert ist.

Ändern Sie die Standarddatenbank für sa myApp, hier:

enter image description here

+0

Hallo, danke, aber die Standard-Datenbank für Benutzer sa wurde bereits auf myapp gesetzt .... immer noch der gleiche Fehler auftritt. – Flo

Verwandte Themen