2010-01-30 14 views
9

que tiene un cuadro de texto asp.net como esto:ASP: Cuadro de texto Valor desaparece en la devolución de datos únicamente cuando la contraseña

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

Es, como es de suponer, el cuadro de texto de un teclado de PIN en la pantalla. Javascript rellena los valores. La página se publica cada cinco segundos (usando un panel de actualización, si eso es importante) para actualizar otros elementos no relacionados en la pantalla. Esto funciona bien.

Sin embargo, al convertir a una caja de texto de la contraseña, así:

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

Entonces cada vez que los mensajes página Atrás, el cuadro de texto se borra de la pantalla y el cuadro de texto está vacía (aunque durante el evento del temporizador, el valor regresa al servidor.)

¿Alguna sugerencia de cómo solucionar esto, para que conserve su valor durante la devolución?

+3

hay artículo sobre cómo solucionar esto de forma más segura (si no perfectamente) en http://www.codeproject.com/Articles/18927/How-to-safely-keep-a-password- field-during-postbac – Mark

Respuesta

15

Como una característica de seguridad, ASP.NET intenta no permitirle devolver el valor de la contraseña al cliente. Si está de acuerdo con los problemas de seguridad (es decir, no es información realmente segura o está seguro de que la conexión es segura), puede establecer manualmente el atributo "value" del control, en lugar de usar su propiedad Text. Puede parecer algo como esto:

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

aquí es otra manera de hacerlo: -

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

El problema de perder la contraseña en la devolución de datos puede ser evitar hacer uso de JavaScript asíncrono llama, permite describir un escenario típico para una página de inicio de sesión:

digamos que tenemos una página de acceso que permite al usuario cambiar el idioma de sus etiquetas cuando el usuario seleccione un idioma con una lista desplegable

enter image description here

una solución sería invocar SelectedIndexChanged caso de la lista desplegable, hacer una devolución de datos que va al servidor y recoge las etiquetas en el idioma elegido.

En este caso, la contraseña de campo se perderá debido a la función de seguridad de ASP.NET que hace que los campos de contraseña no se conserven entre una devolución de datos.

Este escenario se puede resolver si se evita la devolución de datos utilizando la tecnología JavaScript asíncrona y las llamadas XML (Ajax).

Agregar una función de JavaScript que se ejecuta desde el control de lista desplegable, en este caso se le asigna esta función a la propiedad de comando de la lista desplegable en el código detrás:

function ValueChanged(div) 
      { 
       var table = div.getElementsByTagName("table"); 
       if (table && table.length > 0) 
       { 
        var t = table[0].getAttribute('type'); 
        if (t != null && (t == "DropDown")) 
        { 
         var inputs = div.getElementsByTagName("input"); 
         if (inputs && inputs.length == 2) 
         { 

          { 
           Translate(inputs[1].value); 
          } 
         } 
        } 
       } 
      } 

La Traducir función toma como parámetro seleccionado idioma de opción en el control desplegable y realiza la llamada asincrónica como se muestra a continuación.

function Translate(lang) 
      { 
       var request = null; 
       if (window.XMLHttpRequest) 
       { 
        request = new XMLHttpRequest(); 
        if (request.overrideMimeType) 
        {       
         request.overrideMimeType('text/xml'); 
        } 
       } 
       else if (window.ActiveXObject) 
       { 
        request = new ActiveXObject("Msxml2.XMLHTTP"); 
       } 
       if (request == null) 
       { 
        return; 
       } 
       var url = "GetLoginTranslations.aspx";    
       request.open('GET', url +'?lang=' + lang, true); 
       request.setRequestHeader("Cache-Control", "no-cache"); 
       request.setRequestHeader("Pragma", "no-cache"); 
       request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); 
       request.onreadystatechange = function() { TranslateLabels(request); }; 
       request.send(null); 
      } 

la función Traducir muestra arriba realiza la llamada y obtener los resultados en la página .aspx especificada (en este caso "GetLoginTranslations.aspx ")

cuando la solicitud se completa y el request.onreadystatechange se establece en las TranslateLabels función se ejecutará esta función.

de esta manera la devolución de datos no se ejecuta como antes en caso OnSelectedIndexChanged de la lista desplegable . Control

la función TranslateLabels sería algo como:

function TranslateLabels(request) 
      {     
       if (request.readyState == 4) 
       { 
        if (request.status == 200) 
        { 
         if (request.responseXML) 
         { 
          var objRoot = request.responseXML.documentElement; 
          if (objRoot) 
          { 
           if (objRoot.nodeName == "strings") 
           { 
            for (var i = 0; i < objRoot.childNodes.length; i++) 
            { 
             var node = objRoot.childNodes[i]; 
             var elem; 
             switch (node.getAttribute("id")) 
             { 
              case "lbl_login": 
               elem = document.getElementById("lbl_login"); 
               if (elem) 
                elem.innerHTML = node.firstChild.nodeValue; 
               break; 
             } 
///.... 
} 
} 
} 
} 
} 
} 

la request.responseXML contiene el código XML incorporado en la página GetLoginTranslations.aspx y la estructura de este XML se define allí.

el evento Load() en el GetLoginTranslations.aspx debe verse como:

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(); 

     } 

Algunas otras consideraciones:

  • establezca la propiedad AutoPostBack de la lista desplegable en false.
3
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; 
     } 
    } 
} 
Cuestiones relacionadas