IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Récuperer un Json avec validation AntiForgeryToken


Sujet :

ASP.NET MVC

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Par défaut Récuperer un Json avec validation AntiForgeryToken
    Bonjour tout le monde !

    Dans mon application je fais actuellement un appel ajax en post en sérialisant mon objet compagnie afin de sauvegarder l'édition dans une action de mon controller

    Pour ce faire j'utilise une classe JsonModelBinder
    qui récupère mon Json et le desérialise en un objet compagnie afin de pouvoir le manipuler dans une action de mon controller

    Donc Mon json est de la forme de :
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {"CompanyName":"Loremipsum","CompanyNumber":"111150","CompanyLeftPostalCode":"h1y","CompanyRightPostalCode":"3V8","CompanyProvince":"Loremipsum","CompanyStreet":"Loremipsum","CompanyStreetSuite":"Loremipsum","CompanyPhone":"514-222-7894","CompanyCity":"Loremipsum"}

    mon appel Ajax :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     function SaveCompany() {
     
            var model = new Object();
            // population de mon objet
            var URL = "SaveCompany";
     
            $.post(URL, JSON.stringify(model), function (data) {
                          $("#divResult").html(data);
                          //Traitement
            });
        }

    et voici le controller
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            //
            // POST: 
     
            [HttpPost]
            //[ValidateAntiForgeryToken]
            [JsonModelBinder(ActionParameterName = "model", ActionParameterType = typeof(Company))]
            public ActionResult SaveCompany(Company model)
            {
                // Traitment
     
                return PartialView("_CompanyDetailsPartial", model);
            }

    ça marche ... Seulement si je veux ajouter AntiForgeryToken mon JsonModelBinder n'est plus capable de desérialiser mon json

    voici la classe
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class JsonModelBinder : DefaultModelBinder {
            public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
                if(!IsJSONRequest(controllerContext)) {
                    return base.BindModel(controllerContext, bindingContext);
                }
     
                // Get the JSON data that's been posted
                var request = controllerContext.HttpContext.Request;
                var jsonStringData = new StreamReader(request.InputStream).ReadToEnd();
     
                // Use the built-in serializer to do the work for us
                //return new JavaScriptSerializer()
                //    .Deserialize(jsonStringData, bindingContext.ModelMetadata.ModelType);
     
                // -- REQUIRES .NET4
                // If you want to use the .NET4 version of this, change the target framework and uncomment the line below
                // and uncomment the above return statement
                return new JavaScriptSerializer().Deserialize(jsonStringData, bindingContext.ModelMetadata.ModelType);            
            }
     
            private static bool IsJSONRequest(ControllerContext controllerContext) {
                var contentType = controllerContext.HttpContext.Request.ContentType;
                return contentType.Contains("application/json");
            }
        }

    j'ai récupérer le code source suivant :
    http://www.codeproject.com/Articles/...i-Forgery-Toke

    afin de faire cette appel :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $.postAntiForgery(URL, JSON.stringify(model), function (data) { ...

    avec un @Html.AntiForgeryToken() dans le form

    le json est le suivant :

    {"CompanyName":"DicomExpress","CompanyNumber":"111150","CompanyLeftPostalCode":"h1t","CompanyRightPostalCode":"3a8","CompanyProvince":"QC","CompanyStreet":"6-6855 35E","CompanyStreetSuite":"","CompanyPhone":"514-222-7894","CompanyCity":"Montréal"}&__RequestVerificationToken=AOM1R5QxOobMtxcApkoPx1zYHkAd4RC9hsaNF0rnubIizBtQQaawOLAs5FawMdtzqMxx2PDdQDEwd1gkwNs5pPsOEEF0Qen6_047DpkGLEPuDdWSs5CBEquAhI4Lh3SaTV4m7lh4q1Naasdh0EbGsg2

    mais mon JsonModelBinder ne desérialise pas

    dans le lien je n'utilise pas :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public abstract class AntiForgeryControllerBase : Controller{
       private readonly ValidateAntiForgeryTokenAttribute _validator;
     
        private readonly AcceptVerbsAttribute _verbs;
     
        protected AntiForgeryControllerBase(HttpVerbs verbs, string salt)
        {
           this._verbs = new AcceptVerbsAttribute(verbs);
           this._validator = new ValidateAntiForgeryTokenAttribute()
            {
                    Salt = salt
            };
       }
     
      protected override void OnAuthorization(AuthorizationContext filterContext)
      {
          base.OnAuthorization(filterContext);
     
          string httpMethodOverride = 
    		filterContext.HttpContext.Request.GetHttpMethodOverride();
          if (this._verbs.Verbs.Contains
    		(httpMethodOverride, StringComparer.OrdinalIgnoreCase))
          {            this._validator.OnAuthorization(filterContext);
         }
      }}

    car j'ai l'erreur suivante :

    Erreur 1 'System.Web.Mvc.ValidateAntiForgeryTokenAttribute.Salt' est obsolète*: 'The 'Salt' property is deprecated. To specify custom data to be embedded within the token, use the static AntiForgeryConfig.AdditionalDataProvider property.

    Je ne vois pas comment utiliser AntiForgeryConfig.AdditionalDataProvider...

    Est ce que quelqu'un pourrait m'aiguiller ? Merci d'avance !

  2. #2
    Nouveau candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Par défaut
    Suite au debug

    mon desérialise plante lorsqu'il rencontre :

    &__RequestVerificationToken=AOM1R5QxOobMtxcApkoPx1zYHkAd4RC9hsaNF0rnubIizBtQQaawOLAs5FawMdtzqMxx2PDdQDEwd1gkwNs5pPsOEEF0Qen6_047DpkGLEPuDdWSs5CBEquAhI4Lh3SaTV4m7lh4q1Naasdh0EbGsg2

    Normal... puisque ce n'est pas un format correct pour un json

    il faut que mon json finisse par cette chaine sinon le serveur ne reconnait pas le RequestVerificationToken et coupe court...

    Donc, je me disais, est-ce qu'il y a un moyen, une fois RequestVerificationToken de validée avec le serveur, de modifier le stream pour supprimer cette chaine

    &__RequestVerificationToken=AOM1R5QxOobMtxcApkoPx1zYHkAd4RC9hsaNF0rnubIizBtQQaawOLAs5FawMdtzqMxx2PDdQDEwd1gkwNs5pPsOEEF0Qen6_047DpkGLEPuDdWSs5CBEquAhI4Lh3SaTV4m7lh4q1Naasdh0EbGsg2

    afin que mon JsonModelBinder puisse desérialiser et créer mon objet company pour le donner à mon action SaveCompany ???

    Toute aide me sera fort utile

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/01/2006, 09h23
  2. Buotons radios avec validation par boite de dialogue
    Par alexbubs dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/10/2005, 18h21
  3. [Struts]validation de Integer et de Float avec Validator
    Par jklassen dans le forum Struts 1
    Réponses: 6
    Dernier message: 28/07/2004, 14h03
  4. récuperer l'@IP Avec la table nat
    Par acastor dans le forum Développement
    Réponses: 4
    Dernier message: 10/06/2004, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo