none
ASP NET MVC problème ... Login?__RequestVerificationToken ... RRS feed

  • Question

  • Bonjour à tous

    je développe une application en ASP net MVC.

    Voici une portion de ma View :

            <form class="login-form">
                @using (Html.BeginForm("Authentifier", "Account", FormMethod.Post) {
                    @Html.AntiForgeryToken()
                    <div class="form-group">
                        <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
                        <label class="control-label">Identifiant</label>
                        <input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="Saisissez votre identifiant" name="username" />
                    </div>
                    <div class="alert alert-danger display-hide"> <span>Veuillez remplir ce champ</span> </div>
                    <div class="form-group">
                        <label class="control-label">Mot de passe</label>
                        <input class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="Saisissez votre mot de passe" name="password" />
                    </div>
                    <div class="alert alert-danger display-hide"> <span>Veuillez remplir ce champ</span> </div>
                    <div class="form-actions">
                        <button type="submit" class="btn btn-primary uppercase">Se connecter</button>
                    </div>
                    <div class="form-actions">
                        <div class="pull-right forget-password-block"> <a href="javascript:;" id="forget-password" class="forget-password">Mot de passe oublié</a> </div>
                    </div>
                }
            </form>

    Dans mon controller , j'ai une fonction qui vas vérifier l'existence de l'utilisateur dans ma base de données :

            //
            // POST: /Account/Login
            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Authentifier(MyObj obj, string returnUrl)
            {.....}

    En lançant l'application et en introduisant le login et le mot de passe dans ma formulaire, la page reste sur elle même et dans la barre d'URL , j’obtiens l'URL ci_dessous : 

    http://localhost:25872/Account/Login?__RequestVerificationToken=14QIZ1gZby7Umuo_fglNAgV7MqMxmq4cJUJFQkwmsRMa-RkBK7nkPe4S7dEGmz8Mfe0f4S8CtjKecwVIyX-HVy59PQKwfRpcX9rQAvadlMo1&username=gf&password=gfgf

    Est ce que vous avez une idée de ce problème ou il  aussi quelque chose que je dois comprendre???

    merci beaucoup pour votre aide

    mardi 20 octobre 2015 11:45

Réponses

  • Bonjour,

    Votre formulaire post les infos vers l'url Account/Authentifier.

    Est-ce cette url qui est indiquée dans votre fichier web.config comme url d'authentification ?
    Je ne pense pas car l'url retournée indique que vous essayez d'atteindre une url interdite (demandant une authentification).

    Ensuite, que contient votre classe MyObj ? MVC essaye à partir des données du post de recréer votre objet MyObj.

    NB : remarquez le pb de sécurité : le mot de passe est indiqué en clair dans l'url ;-))))


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse thierrylaz lundi 26 octobre 2015 10:07
    mercredi 21 octobre 2015 06:33

Toutes les réponses

  • Bonjour,

    Votre formulaire post les infos vers l'url Account/Authentifier.

    Est-ce cette url qui est indiquée dans votre fichier web.config comme url d'authentification ?
    Je ne pense pas car l'url retournée indique que vous essayez d'atteindre une url interdite (demandant une authentification).

    Ensuite, que contient votre classe MyObj ? MVC essaye à partir des données du post de recréer votre objet MyObj.

    NB : remarquez le pb de sécurité : le mot de passe est indiqué en clair dans l'url ;-))))


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse thierrylaz lundi 26 octobre 2015 10:07
    mercredi 21 octobre 2015 06:33
  • Bonjour,

    On dirait que votre formulaire est envoyé en GET car vous récupérez toutes les informations du formulaire dans votre URL, et comme il serait en GET votre méthode [HttpPost] n'est pas applicable.

    Votre BeginForm() me semble correct, aussi je ne vois pas pourquoi c'est transmis en GET. Je vous conseillerais de vérifier cela avec le débogueur de IE ou avec Fiddler pour s'assurer de la bonne transmission du formulaire et éventuellement détecter des redirections quelconques. Mettez également des point d'arrêt dans vos actions du contrôleur pour vérifier les différentes étapes de votre processus.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 21 octobre 2015 07:25
  • non.

    Il fait bien un post mais vers une url non autorisée => redirection d'ASP .NET


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 21 octobre 2015 07:30
  • Bin pourtant son action est [AllowAnonymous] !

    J'ai loupé quelque chose ?


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 21 octobre 2015 07:33
  • Yep mais faudrait :

    1/ verifier qu'il va bien dans ce code (doute sur MyObj)

    2/ Quid après ? Si c'est dans un cadre Owin,config securité du web.config, etc. il peut être redirigé autre part tout en n'étant pas authentifié.

    Ce qui me fait dire ça c'est que l'url de redirection contient les infos


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 21 octobre 2015 07:36
  • 1) C'est pour ca que je préconisait les points d'arrêt. Mais il ne me semble pas que l'objet en argument puisse modifier la route (en tout cas dans le contexte tel qu'il nous est présenté), le binding s'applique ou pas.

    Je n'avais pas tilté qu'il était redirigé sur /Account/Login, donc l'url d'authentification par défaut. En effet c'est plus un problème d'authentification pour le coup, je suis allé trop vite.


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 21 octobre 2015 07:50
  • Yep : Point d'arrêt, point d'arrêt ;-)

    point d'arrêt powa (fatigué moi ce matin!)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone


    mercredi 21 octobre 2015 07:51
  • Moi j'aime bien :) J'ai mon associé qui me fait les mêmes tous les jours :)

    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 21 octobre 2015 07:53
  • Bonjour à tous,

    je vais regarder ces cas et je reviens vers vous.

    merci beaucoup :)

    mercredi 21 octobre 2015 11:25
  • j'ai fais quelque chose comme ci-dessous, ça marche mais je sais pas vraiment pourquoi ou est ce que vous avez une bonne pratique pour le faire:

    ------------------------------------------------------------------------------------------------------------------

    VIEW :

    <form class="login-form" action="/Account/Authentifier" method="post">
                @Html.AntiForgeryToken()
               
                    <div class="form-group has-error">
                        <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
                        <label class="control-label">Identifiant</label>
                        <input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="Saisissez votre identifiant" name="login" value=@ViewBag._login>
                    </div>
                    <div class="alert alert-danger display-hide"> <span>Veuillez remplir ce champ</span> </div>
                    <div class="form-group has-error">
                        <label class="control-label">Mot de passe</label>
                        <input class="form-control form-control-solid placeholder-no-fix " type="password" autocomplete="off" placeholder="Saisissez votre mot de passe" name="mot_de_passe_collaborateur" value=@ViewBag._password>
                    </div>
                    <div class="alert alert-danger display-hide"> <span>Veuillez remplir ce champ</span> </div>
                    <div class="form-actions">
                        <button type="submit" class="connectBtn btn btn-primary uppercase">Se connecter</button>
                    </div>
                    <div class="alert-danger pull-left error-connexion"  style="margin-top:14px;"><span>Merci de vérifier votre login et mot de passe</span> </div>
                    <div class="form-actions">
                        <div class="pull-right forget-password-block"> <a href="javascript:;" id="forget-password" class="forget-password">Mot de passe oublié</a> </div>
                    </div>
    </form>

    -----------------------------------------------------------------------------------------------------

            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public ActionResult Authentifier(Collaborateur collaborateur, string returnUrl) {
                if (!ModelState.IsValid) {
                    return View(collaborateur);
                }

                ViewBag.connected = true;
                httpClientManager = HttpClientManager.getInstance();
                try {

                    Allcollaborateurs = httpClientManager.GetAllCollaborateurs();
                }
                catch {

                    //to do :
                }

                @ViewBag._login = collaborateur.login;
                ViewBag._password = collaborateur.mot_de_passe_collaborateur;
                if (Allcollaborateurs.Count() == 0) {
                    // to do : message , pas de collaborateurs
                }

                var user = Allcollaborateurs.Where(a => a.login.Equals(collaborateur.login) && a.mot_de_passe_collaborateur.Equals(collaborateur.mot_de_passe_collaborateur)).FirstOrDefault();
                if (user != null) {
                    ViewBag.connected = true;
                    return RedirectToLocal(returnUrl, "Index", "Home");
                }

                ViewBag.connected = false;
                return View("Login");
            }

    ------------------------------------------------------------------------------------------------------------------------

    ma fonction GetAllCollaborateurs() récupère les objets collaborateurs dans une base de données distante à partir d'un Web service:

            public   IEnumerable<Collaborateur> GetAllCollaborateurs() {
                try {
                    IEnumerable<Collaborateur> allCollaborateurs = null;
                    using (var client = new HttpClient()) {

                        client.BaseAddress = new Uri(EndPoint);
                        client.DefaultRequestHeaders.Accept.Clear();
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        HttpResponseMessage response = client.GetAsync("api/Collaborateur").Result;
                        if (response.IsSuccessStatusCode) {
                            allCollaborateurs = response.Content.ReadAsAsync<IEnumerable<Collaborateur>>().Result;
                        }
                    }

                    return allCollaborateurs;
                }
                catch (Exception ex) {
                    throw new Exception ("Erreur lors de la récupération des collaborateurs\n"+ex.Message+"");
                
                }
            }

    -------------------------------------------------------------------------------------------------------------------

    Et ma classe collaborateur  :

        public  class Collaborateur
        {
            public int matricule_collaborateur { get; set; }
            public string nom_collaborateur { get; set; }
            public string prenom_collaborateur { get; set; }

            public string adresse_mail_collaborateur { get; set; }
            public byte[] photo_collaborateur { get; set; }
            public string fonction_collaborateur { get; set; }
            public string tel_collaborateur { get; set; }
            public Nullable<int> id_role { get; set; }

            [DataType(DataType.Password)]
            public string mot_de_passe_collaborateur { get; set; }
            public Nullable<int> id_objectif { get; set; }
            public Nullable<int> id_statut { get; set; }
            public Nullable<int> id_region { get; set; }
            public Nullable<int> id_ville { get; set; }
            public Nullable<int> id_quartier { get; set; }
            public string login { get; set; }
        
            public virtual ICollection<Annulation> t_annulation { internal get; set; }
            public virtual Objectif t_objectif { get; set; }
            public virtual Quartier t_quartier { get; set; }
            public virtual Region t_region { get; set; }
            public virtual Role t_role { get; set; }
            public virtual Statut t_statut { get; set; }
            public virtual Ville t_ville { get; set; }
            public virtual ICollection<Membre> t_membre { internal get; set; }
            public virtual ICollection<Message> t_message { internal get; set; }
        }

    ----------------------------------------------------------------------------------------------------------------------

    En allant par les breakpoints et en regardant fidler , j'obtiens u header comme ci_dessous :

    Cookie: ai_user=B7CEAF93-EE88-4C76-9063-C3E75EF27712|2015-10-16T12:25:16.211Z; __RequestVerificationToken=7lfO0uNG5QsZS-Jrm3qEQsADITICxSdh9rDTxQC8ZnyidUpjrag_CCWKDk0M7cGSBhUPl6VElj-44gN-sVVY_Fjvg-_4ls0088uNlz3OPYo1

    Bien Vous :)

    mercredi 21 octobre 2015 11:57