En gros, j'ai une table qui contient quelques propriétés pour une entreprise. Il s'agit de la table "maître" et leur ID est utilisé dans de nombreuses autres tables. Je trouve essentiellement leur ID par cette méthode :
private Company currentcompany()
{
Company cuco = db.Companies.Single(x => x.username == User.Identity.Name);
return cuco;
}
Je dois donner aux utilisateurs la possibilité de mettre à jour divers détails les concernant stockés dans cette table, ce que j'ai fait parfaitement bien - cependant, j'ai remarqué une grande faille de sécurité !
En utilisant Tamper Data sur Firefox (et j'imagine Fidler/beaucoup d'autres), je pourrais facilement changer l'ID caché et modifier les détails d'une autre entreprise.
Pour arrêter cela, j'ai ajouté les lignes suivantes à l'action modify :
Company cuco = currentcompany();
if (company.id != cuco.id)
{
return Content("Security Error");
}
(FYI - Company
est un modèle/POCO représentant une entreprise, et company
lui-même est la donnée du formulaire).
Après avoir ajouté ceci, si je modifie l'ID dans les données du formulaire, cela fonctionne comme prévu et fait apparaître "Security Error", cependant, s'il n'y a pas d'erreur et que je continue, j'obtiens l'erreur dans la question.
"Un objet avec la même clé existe déjà dans l'ObjectStateManager. L'ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé."
Je pense que c'est parce que EF détecte et conserve la première extraction de données, mais je ne suis pas sûr de la façon de corriger cela.
Des conseils ?
edit- -mise à jour-
Si vous comprenez ce que j'essaie de faire, y a-t-il un meilleur moyen de contourner ce problème ?