2009-01-23 7 views
8

Beim Testen war der Benutzer auf einer db, die ich verwendet habe, ein großer Jefe. In der Produktion hat er nur Execute.ASP.Net Mitgliedschaft.DeleteUser

Als ich, genannt

Membership.DeleteUser(user) 

Im Test funktionierte es. Ich versuche, das gleiche in der Produktion, und ich bekomme diese:

The DELETE statement conflicted with the REFERENCE constraint "FK__aspnet_Us__UserI__37703C52". The conflict occurred in database "Testing", table "dbo.aspnet_UsersInRoles", column 'UserId'.

In meinem seargles (Suche auf Google), stieß ich auf diese link wo der Kerl sagen war,

Error: The DELETE statement conflicted with the REFERENCE constraint "FK__aspnet_Me__UserI__15502E78". The conflict occurred in database "YourDBName", table "dbo.aspnet_Membership", column 'UserId'.

Took me a while to find a solution to this across multiple sites and options as the error and possible solutions were rather misleading. Turns out, at least in my case, it was a problem with permissions on the membership database. The user I'm using to connect had access to view the membership details within the database itself, but as part of the aspnet_Users_DeleteUser stored procedure it selects from the sysobjects table. The membership connection user apparently did not have sufficient rights to do that select so the overall delete failed.

The fix for me was to add the user to the aspnet_Membership_FullAccess role for the membership database.

Aber wenn Ich habe getan, dass es nicht funktioniert hat. Hat jemand Ideen, wie man damit umgeht?

Antwort

7

Nach einer kleinen Inspektion ich das Problem gefunden ist diese Zeile in der aspnet_Users_DeleteUser gespeicherte Prozedur:

IF ((@TablesToDeleteFrom & 1) <> 0 AND 
    (EXISTS (SELECT name FROM sysobjects WHERE (name = N'vw_aspnet_MembershipUsers') AND (type = 'V')))) 

Es gibt 3 andere ähnliche Linien für 3 weitere Tische. Wenn der Benutzer, der den gespeicherten Prozess ausführt, keinen Zugriff auf vw_aspnet_MembershipUsers hat, tritt das Problem nicht auf, wenn er aus sysobjects auswählt. Ich bin neugierig zu wissen, warum diese ganze EXISTS-Anweisung notwendig ist.

Unabhängig davon hat die folgende Diskussion, "Access to sysobjects to view user tables without having access to the user tables directly in SQL Server Security", die Antwort. Durch das Gewähren von "VIEW DEFINITION" für die fraglichen Ansichten werden die EXISTS-Anweisungen jetzt erfolgreich ausgeführt und Sie müssen dem Benutzer in der Verbindungszeichenfolge der Anwendung keine unnötigen, unerwünschten oder übermäßigen Berechtigungen gewähren.

2

Ich glaube, Ihre 'REFERENCE' Einschränkung ist eigentlich ein Fremdschlüssel in der Datenbank, die zwischen der Tabelle aspnet_Users und der Tabelle aspnet_UsersInRoles existiert. Ich würde herausfinden, dass der Benutzer, den Sie versuchen, seine UserId in beiden Tabellen hat, und bevor Sie es aus der Tabelle Benutzer entfernen können, muss es auch aus der UsersInRoles-Tabelle entfernt werden.

Haben Sie versucht, http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.removeusersfromroles.aspx, um sicherzustellen, dass alle Rollen von diesem Benutzer entfernt werden? Sie können dies auch überprüfen, indem Sie die Zeilen dieser beiden Tabellen in der Datenbank überprüfen.

4

OK, rate was? Ich lese diese: http://forums.asp.net/t/1254087.aspx

Ok, few minutes after sending my post I found the solution :) It turns out that SELECT PERMISSION had to be added for ASPNET user on vw_aspnet_MembershipUsers view.

But it is still mystery why I didn’t get an error concerning lack of permission. EXIST statement was just returning false.

und gab die Produktion Benutzer SELECT-Berechtigung und voila! Es funktioniert! Danke Jungs!

+0

Dies macht keinen Sinn .. Wenn der Benutzer Berechtigungen für die gespeicherte Prozedur aspnet_Users_DeleteUser ausgeführt hat, sollten die SELECT-Berechtigungen für die Ansicht keine Rolle spielen. Genauso wenig wie DELETE-Berechtigungen für eine beliebige der Aspnet-Tabellen. – Matt

1

Wenn der Fehler (oder ein ähnliches Problem) nach dem Gewähren des ASP-Benutzers SELECT für die vw_aspnet_MembershipUsers weiterhin besteht, möchten Sie SELECT für einige der anderen vw_aspnet _ ???? Ansichten auch. Vor allem "Profil" und "UsersInRoles". Andernfalls - aus bestimmten Gründen erhält der DeleteUser SP beim Auswählen aus diesen Ansichten ein leeres Ergebnis und verweigert das Löschen vorhandener Einträge von diesen.

5

Ich hatte auch dieses Problem, und es wurde von fehlenden Ansichten verursacht, um zu korrigieren Ich habe nur das Erstellungsskript aus einer anderen Datenbank verwendet und alle vw_aspnet_ * Ansichten neu erstellt.

0

Vielleicht besser, um sicherzustellen, dass der Benutzer, der die Löschmitgliedschaft ausführt, die SQL-Rollen der ASP.NET-Mitgliedschaft korrigieren muss. In meinem Fall löschte ich einen Mitgliedschaftsbenutzer, der einige Rollen und Profileigenschaften besitzt.Die Löschmethode ist fehlgeschlagen, aber nach dem Zuweisen der korrekten SQL-Rollen hat sie funktioniert.

ALTER ROLE [aspnet_Profile_FullAccess] ADD MEMBER [<YOUR SQL USER>] 
ALTER ROLE [aspnet_Roles_FullAccess] ADD MEMBER [<YOUR SQL USER>] 

Sie könnten auch [aspnet_Personalization_FullAccess] hinzufügen, wenn Sie diese Funktionalität verwenden.

0

Ich löste dies durch Entfernen der Zeile in der Prozedur, die für die Ansicht überprüft. Ich habe keine ASP-Mitgliedschaftsansichten und habe sie auch nirgends gebraucht, daher erscheint es ziemlich sinnlos, die Ansicht nur so zu erstellen, dass die Codezeile true zurückgeben kann - der proc verwendet diese Ansicht nicht. Wenn Sie mehr Features der Mitgliedschaftsobjekte verwenden, benötigen Sie möglicherweise die Ansicht für etwas anderes. In jedem Fall ist die Überprüfung der Existenz der Ansicht ein seltsamer Weg für den Proc, zu entscheiden, ob die aspnet_membership -Tabelle eine Zeile hat, die gelöscht werden muss.