11
votes

ASP: la valeur de la boîte de texte disparaît en post-pack uniquement lorsque le mot de passe

J'ai une zone de texte ASP.NET comme ceci:

  <asp:TextBox ID="PINPad" runat="server" Columns="6" MaxLength="4" 
       CssClass="PINTextClass" TextMode="Password"></asp:TextBox>


1 commentaires

Il y a un article sur la façon de résoudre cela plus sécurisé (sinon parfaitement) à codeProject.com/articles/18927/...


4 Réponses :


16
votes

En tant que fonctionnalité de sécurité, ASP.NET tente de vous interdire d'envoyer la valeur du mot de passe de retour au client. Si vous acceptez les problèmes de sécurité (c'est-à-dire qu'il n'est pas vraiment sécurisé des informations ou vous êtes sûr que la connexion est sécurisée), vous pouvez définir manuellement la "valeur" code> attribue du contrôle, plutôt que d'utiliser sa propriété texte code>. Cela pourrait ressembler à quelque chose comme ceci:

this.PINPad.Attributes.Add("value", this.PINPad.Text);


0 commentaires

0
votes

Voici une autre façon de le faire: -

using System;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebControlLibrary
{
    public class PWDTextBox : TextBox
    {
        public PWDTextBox()
        {
            this.TextMode = TextBoxMode.Password;
        }

        public string Password
        {
            get
            {
                string val = (string)ViewState["pwd"];
                if (string.IsNullOrEmpty(val))
                {
                    return "";
                }
                else
                {
                    return val;
                }
            }
            set
            {
                ViewState["pwd"] = value;
            }
        }

        public override string Text
        {
            get
            {
                return Password;
            }
            set
            {
                Password = value;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            this.Text = Password;
        }

        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Password);
        }
    }
}


0 commentaires

0
votes

Le problème de la perte de mot de passe dans le potage peut être évité d'utiliser des appels JavaScript asynchrones, permet de décrire un scénario typique pour une page de connexion:

permet de faire une page de connexion qui permet à l'utilisateur de changer la langue. de ses étiquettes lorsque l'utilisateur choisit une langue avec une liste déroulante P>

Entrez la description de l'image ici

Une solution serait d'invoquer sélectionnéeExchangedexchangedexchangedexchanged fort> de la liste déroulante de la liste déroulante, faites un message qui va sur le serveur et récupère les étiquettes dans la langue choisie. P>

Dans ce scénario, le mot de passe de terrain sera perdu en raison de la fonctionnalité de sécurité d'ASP.NET, qui facilite la persistance des champs de mots de passe entre un message de publication. P>

Ce scénario peut être résolu si le poteau est évité de faire une utilisation de JavaScript asynchrone Technologie et appels XML (AJAX). P>

Ajoutez une fonction JavaScript qui sera appelée à partir de la commande DropdownList, dans ce cas, cette fonction est attribuée à la propriété de commande de la liste déroulante du code derrière: p> xxx pré>

La fonction de traduction prend en tant que paramètre de la langue d'option sélectionnée dans la commande déroulante et effectue l'appel asynchrone comme indiqué ci-dessous, comme indiqué ci-dessous. p> xxx pré>

La fonction traduite ci-dessus exécute l'appel et Obtenez les résultats dans la page .aspx spécifiée (dans ce cas "getlogintranslations.aspx") p>

Lorsque la demande est terminée et que la requête.ElreadyStatechange est définie sur la fonction TranslateTelabels Cette fonction sera exécutée. p>

de cette façon, le post-colback n'est pas exécuté comme avant dans l'événement OnSelectedExchanged de la commande DropdownList. P>

La fonction TranslateTelabels ressemblerait à quelque chose comme: p>

protected void Page_Load(object sender, EventArgs e)
        {
  if (Request["lang"] != null)
                strLang = Request["lang"];

            //init response
            Response.Clear();
            Response.Cache.SetExpires(DateTime.Now);
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetValidUntilExpires(true);
            Response.ContentType = "application/xml";
            Response.Charset = "utf-8";


            XmlTextWriter xml = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.UTF8)
            {
                Formatting = Formatting.None
            };
            xml.WriteStartDocument();
            xml.WriteStartElement("strings");

            xml.WriteStartElement("string");
            xml.WriteAttributeString("id", "lbl_login");
            xml.WriteString(GetTranslation("label_login", strLang));
            xml.WriteEndElement();

            // ... the other labels


            xml.WriteEndElement(); //</strings>
            xml.Close();

        }


0 commentaires

4
votes
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
  {
        if (!(String.IsNullOrEmpty(txtPwd.Text.Trim())))
        {
             txtPwd.Attributes["value"]= txtPwd.Text;              
        }
        if (!(String.IsNullOrEmpty(txtConfirmPwd.Text.Trim())))
        {
            txtConfirmPwd.Attributes["value"] = txtConfirmPwd.Text;
        }
  }
}

0 commentaires