La solution que je l'utilise est le plus souvent ceci:
Lorsque l'utilisateur premières visites la page (non-publication automatique), génèrent une valeur symbolique (GUID est facile). Prenez cette valeur de jeton et stockez-la dans leurs variables de session et un champ masqué dans la page. Étant un champ, cette valeur devrait persister à travers des allers-retours au serveur sans ViewState activé (je pourrais me tromper sur ce compte, donc s'il vous plaît vérifiez-le!). Si la page est actualisée (et que les valeurs de formulaire sont perdues), une nouvelle valeur sera générée par l'initialisation Non-PostBack.
Lorsque la page est affichée en arrière, récupérer la valeur du champ caché et la comparer à la valeur attendue dans les variables de session de l'utilisateur:
- Si les jetons correspondance, accepter la soumission comme « authentique », retirez-la jeton des variables de session et continuez votre flux de travail.
- Si le jeton est manquant dans les variables de session, l'utilisateur tente à nouveau de soumettre le formulaire. - Si les jetons ne correspondent pas, l'utilisateur "rejoue" une ancienne soumission du formulaire.
code exemple pour réaliser ce genre de solution:
public partial class MyPage : Page
{
protected HiddenField tokenField;
protected void Page_Load()
{
if(!IsPostBack)
CreateToken();
}
// Call this method to establish a token in session and on the page.
private void CreateToken()
{
string token = new Guid().ToString();
Session["dupeToken"] = token;
tokenField.Value = token;
}
// Call this method to validate the token before continuing workflow.
private bool TokenIsValid()
{
string expectedToken = (string)Session["dupeToken"];
if(expectedToken == null)
return false;
string actualToken = tokenField.Value;
return expectedToken == actualToken;
}
// Call this method when the page submission is complete to prevent re-submission.
private void ConsumeToken()
{
Session["dupeToken"] = null;
}
}
Si la deuxième communication effectivement * illégale *, ou est-il simplement * habituellement * non intentionnel? –
Beaucoup de gens cherchent des réponses à cette question. Moi aussi inclus dans cette liste. Le problème est que tout le monde dit "Programmer votre code pour que cela puisse être évité" ... comme le champ distint dans DB ... Mais il y a beaucoup de ifs et Buts dedans. A partir de maintenant, je suis toujours à la recherche ... –