Ich habe ein Webprojekt (C # Asp.Net, EF 4, MS SQL 2008 und IIS 7) und muss es lokal auf IIS 7 migrieren (im Moment funktioniert es gut mit CASSINI).
Lokal in IIS habe ich meinen Default Web Site
mit meiner Bereitstellung. Sowohl mein Deploy als auch Default Web Site
befinden sich im Pool ASP.NET v4.0 (siehe Image für Einstellungen) des Pool-Ziel-Frameworks 4 als mein Webprojekt .Beim Besuch der Website zeigt der Browser die Seite nicht an, und der Browser kann stattdessen die Seite herunterladen.
Ich habe andere Projekte, die lokal auf IIS ausgeführt werden, und sie funktionieren ohne Probleme (aber sie verwenden kein Entity Framework).
Mit dem Event Logger sehe ich Fehler wie folgt:
Exception information:
Exception type: EntityException
Exception message: The underlying provider failed on Open.
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
UPDATE: Sie können in den Ressourcen zu dieser Frage nachlesen, dass Berechtigungen für MS SQL 2008 manuell erteilt werden müssen, wie in seiner Antwort erläutert Verwenden Sie IIS 7.5 und MS SQL 2008 R2, um die Berechtigung manuell festzulegen sollte nicht notwendig sein.
Sieht so aus, als wäre der Versuch fehlgeschlagen, eine Verbindung zu SQL Server zu öffnen.
Sie müssen SQL Server ein Login für IIS APPPOOL\ASP.NET v4.0
hinzufügen und der Datenbank Berechtigungen erteilen.
Erweitern Sie im SSMS unter dem Server die Sicherheit, klicken Sie mit der rechten Maustaste auf Anmeldungen und wählen Sie "Neue Anmeldung ...".
Geben Sie im Dialogfeld "Neues Login" den App-Pool als Login-Namen ein und klicken Sie auf "OK".
Sie können dann mit der rechten Maustaste auf das Login für den App-Pool klicken, Eigenschaften auswählen und "Benutzerzuordnung" auswählen. Überprüfen Sie die entsprechende Datenbank und die entsprechenden Rollen. Ich denke, Sie könnten einfach db_datareader
und db_datawriter
auswählen, aber ich denke, Sie müssten trotzdem Berechtigungen zum Ausführen gespeicherter Prozeduren erteilen, wenn Sie dies über EF tun. Sie können die Details für die Rollen hier überprüfen.
Sie können ApplicationPoolIdentity unter IIS7 -> Anwendungspools -> Erweiterte Einstellungen ändern.
Unter ApplicationPoolIdentity finden Sie das lokale System. Dadurch wird Ihre Anwendung unter NT AUTHORITY\SYSTEM
ausgeführt. Hierbei handelt es sich standardmäßig um eine vorhandene Anmeldung für die Datenbank.
Bearbeiten: Bevor Sie diesen Vorschlag anwenden, sollten Sie die Sicherheitsauswirkungen beachten und verstehen.
stellen Sie sicher, dass Sie ...
Trusted_Connection=false;
in deiner verbindung string
Ich habe dieses Problem mit SQL als folgendes Bild gelöst.
Klicken Sie mit der rechten Maustaste auf Datenbank -> Eigenschaften -> Berechtigung -> Berechtigung für Server anzeigen -> und wählen Sie dann IIS APPPOOL\ASP.NET v4.0
aus und erteilen Sie die Berechtigung.
Führen Sie dieses SQL-Skript aus
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser]
FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO
Wenn Sie in der Verbindungszeichenfolge Folgendes angegeben haben:
User ID=xxx;Password=yyy
aber in der Verbindungszeichenfolge gibt es:
Trusted_Connection=true;
SQL Server verwendet die Windows-Authentifizierung, sodass Ihre Verbindungswerte ignoriert und überschrieben werden (IIS verwendet das in Identity-Benutzerprofil angegebene Windows-Konto) . weitere Informationen hier
Dasselbe gilt, wenn in der Verbindungszeichenfolge Folgendes enthalten ist:
Integrated Security = true;
oder
Integrated Security = SSPI;
weil die Windows-Authentifizierung für die Verbindung zum Datenbankserver verwendet wird . weitere Informationen hier
Ich hasse die ApplicationPoolIdentity. Ich habe immer ein Windows-Benutzerkonto als Konto in AppPools festgelegt.
Wie gesagt, es klingt wie ein Problem mit der Datenbanksicherheit. Erstellen Sie also ein NT-Benutzerkonto, weisen Sie es dem AppPool von ASP.NET v4.0 zu, und erteilen Sie ihm die Berechtigung für den Websiteordner und die entsprechenden Tabellen in SQL.
gehe zu iis -> Anwendungspools -> finde den in application verwendeten Anwendungspool
Wählen Sie Ihren Anwendungspool für die Anwendung aus. Klicken Sie mit der rechten Maustaste. Wählen Sie Erweiterte Einstellungen aus.
Wählen Sie die Anwendungspoolidentität aus
select als lokales System auswählen und klicken Sie auf OK.
Verwenden Sie keine Integrated Security Verwenden Sie User Id=yourUser; pwd=yourPwd;
.
Das löst das Problem.
Zuerst müssen Sie löschen, ob Sie die Windows-Authentifizierung verwenden und in Ihrer Verbindungszeichenfolge kein Benutzername-Kennwort angeben.
Was passiert, wenn Sie Ihren Code über localhost ausführen: Wenn Sie Ihren wcf-Testclient über localhost ausführen, kann er mit der Datenbank kommunizieren, da die Anwendung im lokalen Debugmodus die Datenbank vom Dienst Ihres Kontos aufruft. Es hat also Zugriff auf die Datenbank, da devenv.exe unter Ihrem Benutzerkonto ausgeführt wird.
Aber wenn Sie Ihren Webdienst in IIS bereitstellen. Verstehen Sie nun, dass dieser Dienst unter IIS = nicht unter Ihrem Konto ausgeführt wird. Daher müssen Sie dem IIS -Dienst Zugriffsrechte zuweisen, um auf den SQL-Server für die Windows-Authentifizierung zuzugreifen. Hier könnte Ihr Web-Service aufgrund von Zugriffsberechtigungsproblemen und der Anmeldung für den Benutzer _______ nicht mit dem SQL-Server kommunizieren (hier kommt Ihr Benutzer)
Wenn Sie also die Windows-Authentifizierung zum Herstellen einer Verbindung mit Ihrer Datenbank verwenden, müssen Sie nur die IIS Anwendungspooleinstellungen ändern. Sie müssen IIS die Identität des Anwendungspools in das lokale System ändern.
Im Folgenden finden Sie die Schritte für die Windows-Authentifizierung für WCF: • Öffnen IIS (Windows + R (Ausführen), geben Sie dann inetmgr ein und klicken Sie auf OK.) • Doppelklicken Sie unter Verbindungen auf Ihren PC-Namen. • Klicken Sie auf Anwendungspools. • Wählen Sie Ihren Anwendungspool aus (DefaultAppPool) • Klicken Sie dann unter Aktionen rechts auf Erweiterte Einstellungen: • Gehen Sie zum Abschnitt Prozessmodell und • klicken Sie auf Identität. • Wählen Sie jetzt LocalSystem.
Öffnen Sie nun Ihr SQL Server Management Studio: Öffnen Sie run-> und geben Sie ssms ein. Drücken Sie dann ok in ssms und melden Sie sich mit Ihrem Windows-Authentifizierungskonto an. Öffnen Sie die Registerkarte "Sicherheit" und erweitern Sie die Registerkarte "Anmeldungen". Anschließend können Sie Ihr Konto anzeigen.
Öffnen Sie nun die Eigenschaften Ihres Kontos Gehen Sie zu userMapping. Wählen Sie dann die Datenbank aus, zu der Sie eine Verbindung herstellen möchten Überprüfen Sie dann die Rollenmitgliedschaftsdienste, die Sie für die ausgewählte Datenbank verwenden möchten Klicken Sie auf OK . (Für Netzwerkdienste dh Intranet-Benutzer müssen die obigen Einstellungen auch für Benutzer von NT AUTHORITY\SYSTEM konfigurieren.
add Trusted_Connection = True; Eigenschaft in Ihrer Verbindungszeichenfolge. Speichern Sie es und stellen Sie den Webdienst bereit. App-Pool neu starten.
sie können jetzt die Datenbank verbinden.
Ich hatte diese Nachricht und verwende die Windows-Authentifizierung auf dem Webserver.
Ich wollte, dass der derzeit authentifizierte Webbenutzer gegenüber der Datenbank authentifiziert wird, anstatt den im App Pool angegebenen IIS APPPOOL\ASP.NET v4-Benutzer zu verwenden.
Ich habe gefunden, indem ich Folgendes in der web.config eingetragen habe, das dies für mich behoben hat:
<system.web>
<identity impersonate="true" />
</system.web>
https://msdn.Microsoft.com/de-de/library/bsz5788z.aspx
Ich sehe andere Antworten zum Erstellen des AppPool-Benutzernamens in der SQL-Datenbank oder nur zur Verwendung von SQL-Authentifizierung. Beides wäre korrekt, wenn Sie nicht einzelne Windows-Benutzer in SQL erfassen oder sichern möchten.
Tom
Ich hatte dieses Problem und es wurde tatsächlich durch etwas anderes verursacht - Ich hatte den Benutzer 'IIS APPPOOL\ASP.NET v4.0' in meiner Datenbank, aber es funktionierte immer noch nicht.
Ich hatte kürzlich meine SQL Server-Installation aktualisiert und der Benutzer wurde dabei vom Login getrennt. Daher gab es unter Datenbank -> Sicherheit -> Benutzer einen 'IIS APPPOOL\ASP.NET v4.0', ABER kein Benutzer, der nicht unter Sicherheit steht -> Anmeldungen.
Der Login "IIS APPPOOL\ASP.NET v4.0" wurde unter "Security -> Logins" hinzugefügt. SQL Server ordnete dies automatisch dem Benutzer in der Datenbank zu (dies musste früher manuell erfolgen) und das Problem wurde behoben.
Keine Windows-Authentifizierung verwenden, SQL Server-Authentifizierung verwenden
Wenn Sie die Verbindung über das Dialogfeld "Serververbindung" erstellt haben, überprüfen Sie die Verbindungen in der Datei "web.config". Es ist wahrscheinlich, dass Sie eine Verbindung erstellt/geändert haben und diese als vertrauenswürdige Verbindung in web.config gespeichert wurde. Verwenden Sie einfach diese Authentifizierung
<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=Finantial;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>
was sollte den Fehler beheben.
Wenn Sie die Identität festlegen, funktioniert dies nur auf meinen Seiten.
Wenn Ihre Verbindungszeichenfolge in Ihrer web.config hinzugefügt wurde, stellen Sie sicher, dass "Integrated Security = false;" Es würde also die ID und das Kennwort verwenden, die in der Datei web.config angegeben sind.
<connectionStrings>
<add providerName="System.Data.SqlClient" name="MyDbContext" connectionString="Data Source=localhost,1433;Initial Catalog=MyDatabase;user id=MyUserName;Password=MyPassword;Trusted_Connection=true;Integrated Security=false;" />
</connectionStrings>
Cassini führt Ihre Website als eigene Benutzeridentität aus, wenn Sie die Visual Studio-Anwendung starten. IIS betreibt Ihre Website als App Pool Identity. Wenn der App Pool Identity kein Zugriff auf die Datenbank gewährt wird, werden Fehler angezeigt.
IIS führte App Pool Identity ein, um die Sicherheit zu verbessern. Sie können Websites unter der Standard-App-Pool-Identität ausführen oder einen neuen App-Pool mit einem eigenen Namen erstellen oder einen neuen App-Pool mit einem eigenen Namen erstellen, der unter einem Benutzerkonto (normalerweise Domänenkonto) ausgeführt wird.
In Netzwerksituationen (die sich nicht in Azure befinden) können Sie einen neuen App Pool unter einem Active Directory-Domänenbenutzerkonto ausführen lassen. Ich ziehe dies dem Maschinenkonto vor. Dadurch erhalten Sie granulare Sicherheit und einen granularen Zugriff auf Netzwerkressourcen, einschließlich Datenbanken. Jede Website läuft in einem anderen App Pool (und jede davon läuft unter einem eigenen Domänenbenutzerkonto).
Verwenden Sie weiterhin die integrierte Sicherheit von Windows in allen Verbindungszeichenfolgen. Fügen Sie in SQL Server die Domänenbenutzer als Anmeldungen hinzu und erteilen Sie Datenbanken, Tabellen, SP usw. auf Website-Basis Berechtigungen. Z.B. DB1, der von Website1 verwendet wird, hat ein Login für Benutzer1, da Website1 in einem App Pool als Benutzer1 ausgeführt wird.
Eine Herausforderung bei der Bereitstellung aus der in Visual Studio integrierten DB (z. B. LocalDB) und dem integrierten Webserver für eine Produktionsumgebung ergibt sich aus der Tatsache, dass die Benutzer-SID des Entwicklers und dessen ACLs nicht in einer sicheren Produktionsumgebung verwendet werden sollen. Microsoft stellt Tools für die Bereitstellung bereit. Aber schade um den armen Entwickler, der an alles gewöhnt ist, was im neuen easy VS IDE mit localDB und localWebServer einfach funktioniert, da diese Tools für diesen Entwickler schwer zu verwenden sein werden, insbesondere für einen solchen Entwickler, dem es an SysAdmin fehlt und DBAdmin-Support oder deren Fachwissen. Die Bereitstellung in Azure ist jedoch einfacher als die oben erwähnte Situation im Unternehmensnetzwerk.
Eine andere Möglichkeit, der Datenbank die Berechtigung für den Benutzer IIS APPPOOL\ASP.NET v4.0
zu erteilen, ist wie folgt.
IIS APPPOOL\ASP.NET
v4.0
hinzu.Ich habe genau das getan, was @JeffOgata gesagt hat, aber ich habe den Fehler erhalten:
Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401)
Ich habe mir meine Fehlermeldung noch einmal angesehen und es stand Login failed for user 'IIS APPPOOL\DefaultAppPool'.
Nach dem Hinzufügen eines Benutzers mit dem Namen IIS APPPOOL\DefaultAppPool
hat alles funktioniert.
Ich verwendete SQL Server Profiler (verfügbar in SSMS => Tools-Menü) und sah dort (als IIS versuchte, eine Verbindung zur Datenbank herzustellen), dass mein IIS - Benutzer aus irgendeinem Grund NT AUTHORITY\IUSR war alle Schritte, die in den Antworten zu dieser Frage empfohlen werden. Also habe ich diesen Benutzer zu SQL Server hinzugefügt, und es hat funktioniert ...
Ich habe das gleiche Problem, das ich gelöst habe, indem ich Integrated Security=True
in false Ändere. Jetzt funktioniert es
In einer bestimmten Datenbank, die nach dem SSMS-Update erstellt wird, können Sie diesem Fehler begegnen. Öffnen Sie SSMS, wählen Sie Ihre Datenbanken aus und öffnen Sie Ihre erforderliche Datenbank. Klicken Sie anschließend auf Security -> Users ->, klicken Sie mit der rechten Maustaste auf Users, und klicken Sie erneut auf 'New User' und fügen Sie'NT AUTHORITY\Authenticated Users hinzu 'und speichern Sie Ihre Arbeit und gehen Sie zu Ihrem Formular auf Web/Desktop, was auch immer Sie tun. Genießen....
Ich hatte das gleiche Problem beim Testen der ASP.NET-Web-API
Entwickelte Web.Host in Visual Studio 2013 Express In SQL Server 2012 Express Erstellte Datenbank. Durchgeführter Test mit eingebautem IIS Express (funktioniert) Geändert zur Verwendung von IIS Local (von Eigenschaftsseite - Weboption) Test mit Fiddler ausgeführt Fehler. Fehler beim Öffnen der Datenbank für Provider .... unter Berufung auf "APPPOOL\DefaultAppPool"
Lösung, die funktioniert hat.
In IIS
Klicken Sie auf Anwendungspool 'DefaultAppPool' Set Identify = 'ApplicationPoolIdentity' Set .NET Framework = v4.0 (auch wenn meine App 4.5 war)
In SQL Server Management Studio
Klicken Sie mit der rechten Maustaste auf den Ordner Sicherheit (unter dem SQL Server-Modul gilt also für alle Tabellen) .__ Klicken Sie mit der rechten Maustaste auf Benutzer, und fügen Sie "IIS APPPOOL\DefaultAppPool" .__ ein. Markieren Sie in der Spalte "Gewähren" die Optionen, die Sie angeben möchten . Wenn Sie ein Datenbankadministrator sind, wissen Sie wahrscheinlich und möchten steuern, ob Welche Optionen dies sind. Wenn Sie wie ich ein Entwickler wären, wollten Sie nur Ihren WEB-API-Service testen, der zufällig auch über EF 6in im MVC-Stil auf SQL Server zugreift. :) Ja ich weiß aber es hat funktioniert.
Ich dachte, ich würde dies als Antwort posten, da es für die Frage relevant ist und es in einigen Fällen beantworten kann.
Dieselbe Meldung erscheint auch wenn die Datenbank nicht existiert!
Stellen Sie sicher, dass Ihre Verbindungszeichenfolge keine Rechtschreibfehler enthält, auf die richtige Serverinstanz verweist usw.
Haben Sie getan, was @Teddy
empfohlen wurde und Sie NOCH die gleiche Fehlermeldung erhalten?
Stellen Sie sicher, dass Sie die Einstellungen für den App-Pool ändern, der Ihrem virtuellen Verzeichnis und nicht dem übergeordneten Server entspricht. Jedes virtuelle Verzeichnis hat einen eigenen AppPool und erbt nicht.
Wenn Sie ein neues Login hinzufügen, stellen Sie sicher, dass der Authentifizierungsmodus unter Servereigenschaften (Rechtsklick -> Eigenschaften)/security auf sqlserver und windows und nicht nur windows eingestellt ist.
Wichtig: Aktivieren Sie "sysadmin" in den Serverrollen
Fügen Sie "Jeder" unter Sicherheit hinzu. Wenn Sie den Server und die Benutzer, die sich bei der Datenbank anmelden, hinzugefügt haben, fehlt Ihnen dies. Hoffe das hilft.
mir ist etwas Ähnliches passiert. Bei mir hat sich die Eigenschaft Integrated Security = True in Integrated Security = false in der web.config der Website geändert
Setzen Sie in DefaultAppPool NetworkService in der Identity-Eigenschaft und fügen Sie in Sql Server User Network Service hinzu und erteilen Sie die entsprechenden Berechtigungen für Ihre Datenbank anderer Computer im Netzwerk. Wenn Sie LocalSystem in der Identität in IIS festlegen, funktioniert dies gut und es ist nicht erforderlich, einen anderen Benutzer in SQL Server zu erstellen. Ich denke jedoch, dass dies in einer Netzwerkumgebung nicht funktioniert.
In Asp.net-Webformular
dieser Fehler wurde bei der Installation von asp.net behoben:
Server-Manager> Verwalten> Rolle und Feature hinzufügen> Serverrollen> Webserver (IIS)> Webserver> Anwendungsentwicklung> ASP.NET 3.5/4.6 ist installiert.
mein Problem behoben.
Wenn Sie nach dem Wechsel von LocalDB
zu SQLEXPRESS
auf diesen Fehler stoßen, stellen Sie sicher, dass die Datenbank bereits in SQLEXPRESS
vorhanden ist. Sie können dies in Management Studio überprüfen.
Ich hatte das gleiche Problem bei der Verwendung von Entity Framework
, nachdem ich zu SQLEXPRESS from LocalDB
gewechselt hatte. Ich musste den Befehl Update-Database
ausführen. Ich konnte danach erfolgreich eine Verbindung herstellen.