none
EntityFramework - StoredProcedure "sp_password" verwenden RRS feed

  • Frage

  • Hallo

    Ich hätte eine Frage zu Entity-Framework - Ich verwende EF bei meiner WinForm-Applikation mit Zugriff auf SQL-Server 2008; die Applikation hat eine Benutzer-Anmelde-Funktion, und ich muss die App. nun erweitern, damit jeder Benutzer sich sein eigenes Passwort abändern kann. Ich dachte dabei an die Stored-Proceduer "sp_password" - und wollte diese in das EF integrieren.............. aber leider steh ich da jetzt an, da mir diese Stored-Proc. gar nicht vorgeschlagen wird.

     

    Kann mir dabei bitte jemand einen Rat geben, wie ich denn diese Stored-Proc. in mein EF.-Model integrieren kann; oder vielleicht hat auch jemand einen anderen Lösungsvorschlag, um das Passwort des Benutzers in der Datenbank zu ändern über die Applikation.??

     

    Vielen Dank schon mal und schönen Gruß

    Michael


    Michael Erlinger
    Mittwoch, 20. April 2011 11:36

Antworten

  • Hallo Michael,

    • "sp_password" ....


    Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwende diese Funktion beim Entwickeln neuer Anwendungen nicht, und plane das Ändern von Anwendungen, in denen sie zurzeit verwendet wird. Verwende stattdessen "ALTER LOGIN".   [sp_password (Transact-SQL)]
    ________________________________

    Für das Entity Framework (mit entsprechenden Berechtigungen) zum Beispiel:

     

      DeineEntities db = new DeineEntities();
      int ret = db.ExecuteStoreCommand("ALTER LOGIN DeinBenutzerName WITH PASSWORD = 'deinPasswort'");
    
    

     


    ciao Frank
    Mittwoch, 20. April 2011 19:09
  • Hallo Michael

    • danke für die Rückmeldung und dem Hinweis, "sp_password" nicht mehr zu verwenden.
      Mit dem "ExecuteStoreCommand(...)" funktioniert die Sache perfekt;

    freut mich.

     

    • [...]"ExecuteStoreCommand(...)" [...] was (vielleicht) ein Nachteil davon ist, dass dem Benutzer die "sysadmin"-Rolle zugewiesen werden muss.

    "sp_password" benötigt die Serverrolle sysadmin oder securityadmin. "ALTER LOGIN" erfordert die "ALTER ANY LOGIN"-Berechtigung, zum Teil wird auch die "ALTER ANY CREDENTIAL"-, oder bei Mitgliedern der sysadmin Rolle eine "CONTROL SERVER"-Berechtigung erforderlich.

     

    • Noch eine Frage zu dem "ExecuteStoreCommand" - ich habe zuerst immer den ReturnCode ausgewertet, und der ist in diesem Fall immer -1 - obwohl die Passwortänderung bzw. der ALTER-Befehlt erfolgreich durchgeführt wurde. Hast Du eine Ahnung wieso dem so ist ??

    Die ExecuteStoreCommand-Methode gibt die "Anzahl der betroffenen Zeilen" zurück, die aber bei diesem Abfrage-Typ by design "-1" ergeben. Das Aufrufen der ExecuteStoreCommand-Methode entspricht aber dem Aufrufen der ExecuteNonQuery-Methode der DbCommand-Klasse [ist dokumentiert] und hier ist wiederum dokumentiert, dass:

    • Bei UPDATE-Anweisungen, INSERT-Anweisungen und DELETE-Anweisungen ist der Rückgabewert die Anzahl der vom Befehl betroffenen Zeilen. Bei allen anderen Anweisungstypen ist der Rückgabewert -1.

    ciao Frank
    • Als Antwort markiert M.Erlinger Donnerstag, 21. April 2011 07:39
    • Bearbeitet Frank Dzaebel Donnerstag, 21. April 2011 07:41
    Donnerstag, 21. April 2011 07:33
  • Hallo Michael,

    Ich habe es probiert mit einem "normalen" Benutzer, und habe die Passwort-Änderung nicht ausführen können; mit der "sysadmin"-Rolle bzw. mit "grant alter any login to...." hat es dann schon funktioniert.

    Als SA kann man alles, klar.

    Beachte bitte die Hinweise auf den MSDN Seiten. Du hattest geschrieben, dass ein Benutzer sein eigenes Kennwort ändern soll. Damit ALTER LOGIN hierfür ohne weitere Berechtigungen erfolgreich aufgerufen werden kann, muss das alte Kennwort bekannt sein (und übergeben werden).

    Der Befehl würde also bspw. so aussehen:

      ALTER LOGIN DerEigeneBenutzername WITH PASSWORD = 'NeuesPasswort' OLD_PASSWORD = 'AltesPasswort'

    Das geht natürlich nur, wenn die Connection, gegen die das Statement ausgeführt wird, auch mit "DerEigeneBenutzername" aufgebaut wurde.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert M.Erlinger Donnerstag, 21. April 2011 07:53
    Donnerstag, 21. April 2011 07:51
    Moderator

Alle Antworten

  • Hallo Michael,

    • "sp_password" ....


    Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwende diese Funktion beim Entwickeln neuer Anwendungen nicht, und plane das Ändern von Anwendungen, in denen sie zurzeit verwendet wird. Verwende stattdessen "ALTER LOGIN".   [sp_password (Transact-SQL)]
    ________________________________

    Für das Entity Framework (mit entsprechenden Berechtigungen) zum Beispiel:

     

      DeineEntities db = new DeineEntities();
      int ret = db.ExecuteStoreCommand("ALTER LOGIN DeinBenutzerName WITH PASSWORD = 'deinPasswort'");
    
    

     


    ciao Frank
    Mittwoch, 20. April 2011 19:09
  • Hallo Frank

    danke für die Rückmeldung und dem Hinweis, "sp_password" nicht mehr zu verwenden.

    Mit dem "ExecuteStoreCommand(...)" funktioniert die Sache perfekt; was (vielleicht) ein Nachteil davon ist, dass dem Benutzer die "sysadmin"-Rolle zugewiesen werden muss.

     

    Noch eine Frage zu dem "ExecuteStoreCommand" - ich habe zuerst immer den ReturnCode ausgewertet, und der ist in diesem Fall immer -1 - obwohl die Passwortänderung bzw. der ALTER-Befehlt erfolgreich durchgeführt wurde. Hast Du eine Ahnung wieso dem so ist ??

     

    Danke & schönen Gruß

    Michael


    Michael Erlinger
    Donnerstag, 21. April 2011 06:46
  • Hallo Michael

    • danke für die Rückmeldung und dem Hinweis, "sp_password" nicht mehr zu verwenden.
      Mit dem "ExecuteStoreCommand(...)" funktioniert die Sache perfekt;

    freut mich.

     

    • [...]"ExecuteStoreCommand(...)" [...] was (vielleicht) ein Nachteil davon ist, dass dem Benutzer die "sysadmin"-Rolle zugewiesen werden muss.

    "sp_password" benötigt die Serverrolle sysadmin oder securityadmin. "ALTER LOGIN" erfordert die "ALTER ANY LOGIN"-Berechtigung, zum Teil wird auch die "ALTER ANY CREDENTIAL"-, oder bei Mitgliedern der sysadmin Rolle eine "CONTROL SERVER"-Berechtigung erforderlich.

     

    • Noch eine Frage zu dem "ExecuteStoreCommand" - ich habe zuerst immer den ReturnCode ausgewertet, und der ist in diesem Fall immer -1 - obwohl die Passwortänderung bzw. der ALTER-Befehlt erfolgreich durchgeführt wurde. Hast Du eine Ahnung wieso dem so ist ??

    Die ExecuteStoreCommand-Methode gibt die "Anzahl der betroffenen Zeilen" zurück, die aber bei diesem Abfrage-Typ by design "-1" ergeben. Das Aufrufen der ExecuteStoreCommand-Methode entspricht aber dem Aufrufen der ExecuteNonQuery-Methode der DbCommand-Klasse [ist dokumentiert] und hier ist wiederum dokumentiert, dass:

    • Bei UPDATE-Anweisungen, INSERT-Anweisungen und DELETE-Anweisungen ist der Rückgabewert die Anzahl der vom Befehl betroffenen Zeilen. Bei allen anderen Anweisungstypen ist der Rückgabewert -1.

    ciao Frank
    • Als Antwort markiert M.Erlinger Donnerstag, 21. April 2011 07:39
    • Bearbeitet Frank Dzaebel Donnerstag, 21. April 2011 07:41
    Donnerstag, 21. April 2011 07:33
  • Hallo

    danke - hat mir sehr weitergeholfen!!

    Schönen Gruß - Michael


    Michael Erlinger
    Donnerstag, 21. April 2011 07:38
  • Hallo Michael,
    was (vielleicht) ein Nachteil davon ist, dass dem Benutzer die "sysadmin"-Rolle zugewiesen werden muss.

    sp_password benötigt lt. Doku dieselben Berechtigungen wie ALTER LOGIN. Siehe dazu auch die jeweiligen Abschnitte in:

      http://msdn.microsoft.com/de-de/library/ms174428.aspx

      http://msdn.microsoft.com/de-de/library/ms189828.aspx

    (Intern ruft sp_password eh ALTER LOGIN auf, daher ist das mit den gleichen Berechtigungen auch verständlich)

    Aber: Es besteht ein Unterschied zwischen Änderung und Zurücksetzen eines Passworts. Wenn User "Test" sein eigenes Passwort unter Angabe des bisherigen Kennworts ändert, sollte das ohne weitere Berechtigungen gehen. Nur wenn ein anderer User das machen will oder man das alte Kennwort nicht weiß, benötigt man höhere Rechte.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 21. April 2011 07:39
    Moderator
  • Hallo Stefan

    danke für Deine Rückmeldung!!

    Ich habe es probiert mit einem "normalen" Benutzer, und habe die Passwort-Änderung nicht ausführen können; mit der "sysadmin"-Rolle bzw. mit "grant alter any login to...." hat es dann schon funktioniert.

    Schönen Gruß - Michael


    Michael Erlinger
    Donnerstag, 21. April 2011 07:42
  • Hallo Michael,

    Ich habe es probiert mit einem "normalen" Benutzer, und habe die Passwort-Änderung nicht ausführen können; mit der "sysadmin"-Rolle bzw. mit "grant alter any login to...." hat es dann schon funktioniert.

    Als SA kann man alles, klar.

    Beachte bitte die Hinweise auf den MSDN Seiten. Du hattest geschrieben, dass ein Benutzer sein eigenes Kennwort ändern soll. Damit ALTER LOGIN hierfür ohne weitere Berechtigungen erfolgreich aufgerufen werden kann, muss das alte Kennwort bekannt sein (und übergeben werden).

    Der Befehl würde also bspw. so aussehen:

      ALTER LOGIN DerEigeneBenutzername WITH PASSWORD = 'NeuesPasswort' OLD_PASSWORD = 'AltesPasswort'

    Das geht natürlich nur, wenn die Connection, gegen die das Statement ausgeführt wird, auch mit "DerEigeneBenutzername" aufgebaut wurde.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert M.Erlinger Donnerstag, 21. April 2011 07:53
    Donnerstag, 21. April 2011 07:51
    Moderator
  • ah - verstehe !!

    die Connection ist natürlich mit dem aktuellen "User" aufgebautf; d.h. ich muss nur das alte Passwort mitschicken.

     

    Danke!!!

    Schönen Gruß

    Michael


    Michael Erlinger
    Donnerstag, 21. April 2011 07:53
  • Hallo Michael,

    • alte Passwort ...

    zur Sicherheit noch einmal der Link aus meinem ersten Posting ;-)

    • B. Ändern eines Kennworts

      Das folgende Beispiel veranschaulicht, wie mit ALTER LOGIN das Kennwort für den Anmeldenamen Victoria von B3r1000d#2-36 in V1cteAmanti55imE geändert wird. Dies ist die bevorzugte Methode. Der Benutzer Victoria kann diesen Befehl ohne zusätzliche Berechtigungen ausführen. Andere Benutzer benötigen die ALTER ANY LOGIN-Berechtigung.

      ALTER LOGIN Victoria WITH 
        PASSWORD = 'V1cteAmanti55imE' 
        OLD_PASSWORD = 'B3r1000d#2-36';
      GO

    ciao Frank
    Donnerstag, 21. April 2011 08:33