fragen stichworte

WCF-Anwendung Bereitstellung in IIS, aber die SQL Server-Datenbankverbindung funktioniert nicht

Ich bin neu bei WCF. Ich versuche, meine WCF-Beispielanwendung auf IIS bereitzustellen. Diese Anwendung funktioniert im Debugmodus mit VS2008 einwandfrei. Diese Anwendung authentifiziert die WCF-Meldungen mit folgendem Code. Ich mache das so, ich habe die resultierten .dlls web.config und die Service.svc im Verzeichnis wwwroot hinzugefügt, und ich habe im IIS-Manager auch die Verbindungszeichenfolge hinzugefügt, die

ist

Server = MyPC \ SQLEXPRESS; Database = MySampleDb; Integrierte Sicherheit = true

Ich verwende Windows-integrierte Sicherheit. Ich verwende dieselbe Verbindungszeichenfolge für die Verbindung in der Datenbankklasse, ich erhalte jedoch die folgende Ausnahme,

Bitte leiten Sie mich bei der Bereitstellung dieser Anwendung In Validater public überschreiben void Validate (Zeichenfolge Benutzername, Kennwort der Zeichenfolge) {     ValidateUser (Benutzername, Passwort);

public static bool ValidateUser (Zeichenfolge Benutzername, Kennwort der Zeichenfolge) {         if (! string.IsNullOrEmpty (Benutzername))     {         ICustomer customer = GetCustomerByUsername (Benutzername);         if (Kunde == null)         {                         neue Ausnahme auslösen ("Benutzer nicht gefunden.");         }         sonst         {             wahr zurückgeben;         }

} 
else 
{ 
    throw new FaultException("User name is required!"); 
}

}

public static ICustomer GetCustomerByUsername (Zeichenfolge Benutzername) {     Versuchen     {        //ConnectionString = "Server = MyPC \ SQLEXPRESS; Database = MySampleDb; Integrierte Sicherheit = true";

OpenConnection ();             var cmd = neuer SqlCommand ("GetUserByUsername", _connection) {CommandType = CommandType.StoredProcedure};

       cmd.Parameters.Add("Username", username);

        connState = _connection.State.ToString();

        if (_connection.State == ConnectionState.Closed)

            OpenConnection();

        SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        ICustomer customer = null;

        customer = ExtractCustomerFromDataReader(dr)[0];
        dr.Close();
        return customer;
    }
    catch (Exception e)
    {
        throw new Exception(e.Message + Environment.NewLine + e.StackTrace);
    }
    finally
    {
        CloseConnection();
    }

} Ausnahme:

ExecuteReader erfordert eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist geschlossen. at System.Data.SqlClient.SqlConnection.GetOpenConnection (String-Methode) bei System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (String-Methode, Befehl SqlCommand) bei System.Data.SqlClient.SqlCommand.ValidateCommand (String-Methode) .AcArkApplant.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Methode "kabeln", DbAsyncRail-Ergebnis) bei System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior). Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior-Verhalten, String-Methode) bei System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior-Verhalten) bei Aschrafi.MobileZollServer.Services.DatabaseHelper.GetCustomerByUsernamer

Ich denke, ich vermisse irgendwann in den Datenbankeinstellungen oder im IIS-Manager die Websiteeinstellungen. Einige Tutorials oder Verknüpfungen für die Bereitstellung von WCFs in iis und die Authentifizierung der WCF-Kommunikation sind sehr zu begrüßen. Danke im Voraus.

antworten

Integrierte Sicherheit bedeutet, dass die Verbindung unter den Anmeldeinformationen des Threads erfolgt, der den Open-Vorgang ausführt. Normalerweise verfügt der Thread über die Prozessanmeldeinformationen, im Fall von IIS und WCF, dh die von AppPool konfigurierten Berechtigungsnachweise, unter denen ausgeführt werden soll. Wenn der Thread einen Identitätswechsel vornimmt (wie dies häufig bei WCF der Fall ist), verfügt der Thread über die Berechtigungsnachweise des aufrufenden Benutzers, und es erfolgt eine -einschränkte Delegierung, um sich bei einem Remote-DB-Server zu authentifizieren. Welche Anmeldeinformationen auch immer verwendet werden, sie müssen vertrauenswürdig sein und dürfen vom DB-Server eine Verbindung herstellen.

Die Lösung Ihrer Probleme hängt also davon ab, was Sie tun, und Sie haben zwar viel Code zur Verfügung gestellt, jedoch nicht die relevanten Informationen.

  • Identifizieren Sie sich?
  • Wenn Ihr WCF-Dienst den Anrufer nicht annimmt, muss dem App-Pool, der für die Ausführung des WCF-Diensts unter IIS konfiguriert ist, die erforderliche Berechtigung zum Herstellen einer Verbindung mit der Datenbank erteilt werden.
    • Wenn Ihr WCF-App-Pool ein Domänenkonto verwendet, erteilen Sie dem Domänenkonto die Berechtigung für die Datenbank
    • Wenn Ihr WCF-App-Pool ein lokales Konto verwendet und die Datenbank auf demselben Host wie IIS gehostet wird, muss dem lokalen Konto die Berechtigung zum Herstellen der Verbindung erteilt werden
    • Wenn Ihr WCF-App-Pool ein lokales Konto verwendet und die Datenbank vom IIS-Host entfernt ist, können Sie keine Verbindung herstellen (gespiegelte Konten sind keine unterstützte Option)
    • Wenn Ihr WCF-App-Pool LocalSystem oder NETWORK SERVICE verwendet und die Datenbank von IIS entfernt ist, muss dem Computerkonto des IIS-Hosts die Berechtigung erteilt werden
    • Wenn Ihr WCF-App-Pool LocalSystem oder NETWORK SERVICE verwendet und die Datenbank lokal ist, muss dem lokalen Systemkonto die Berechtigung erteilt werden
    • Wenn Ihr WCF-App-Pool LOCAL SERVICE verwendet und die Datenbank von IIS stammt, können Sie keine Verbindung herstellen
  • Wenn WCF sich als Person auszeichnet und die Datenbank lokal ist, müssen Sie die Verbindung zum Anrufer gewähren.
  • Wenn WCF imitiert und die Datenbank sich in Remme befindet, müssen Sie eine Verbindung mit dem Anrufer zulassen und die eingeschränkte Delegierung konfigurieren.

All dies ist in der Produktdokumentation ausführlich beschrieben, und Sie sollten nach dem MSDN kein Problem haben:  - WCF-Sicherheitsgrundlagen  - Delegation und Identitätswechsel mit WCF  - WCF-Sicherheitsrichtlinien

Sie zeigen nicht an, wo Sie die Verbindung tatsächlich öffnen. Es ist so, als wäre es geschlossen worden.