2008-10-16 21 views
22

¿Cómo publico un formulario desde una página HTML a la página ASPX (2.0) y puedo leer los valores?Cómo PUBLICAR un FORMULARIO de la página HTML a ASPX

Actualmente tengo un sitio ASP.NET usando el proveedor de Membresía y todo funciona bien. Los usuarios pueden iniciar sesión desde la página de Login.aspx.

Ahora queremos que los usuarios inicien sesión directamente desde otro sitio web, que básicamente es una página HTML estática. Los usuarios deben poder ingresar su nombre y contraseña en esta página HTML y enviarla por correo a mi página de Login.aspx (donde puedo iniciar sesión manualmente).

¿Es posible pasar valores de formulario de HTML a ASPX? He intentado todo y la colección Request.Form.Keys está siempre vacía. No puedo usar HTTP GET ya que son credenciales y no pueden pasarse en una cadena de consulta.

La única forma que conozco es un iframe.

+1

No es éste el tipo de cosa Jeff advirtió en su artículo sobre los ataques CSRF y XSRF? [http://www.codinghorror.com/blog/archives/001175.html](http://www.codinghorror.com/blog/archives/001175.html) –

+0

Me sorprende que nadie más haya mencionado esto, pero un POST HTTP no es más seguro que un GET. Recomendaría no pasar credenciales de esta manera. Muchas ideas e información aquí: http://stackoverflow.com/questions/1008668/how-secure-is-a-http-post –

Respuesta

2

¿Estás seguro de que tu formulario HTML es correcto y, de hecho, realiza un HTTP POST? Sugeriría ejecutar Fiddler2, y luego tratar de iniciar sesión a través de su Login.aspx, luego el sitio HTML remoto, y luego comparar las solicitudes que se envían al servidor. Para mí, ASP.Net siempre funcionó bien: si la solicitud HTTP contiene un POST válido, puedo obtener los valores usando Request.Form ...

27

Esto es muy posible. Me burlé de hasta 3 páginas que se deben dar una prueba de concepto:

.aspx página:

<form id="form1" runat="server"> 
    <div> 
     <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
     <asp:TextBox TextMode="password" ID="TextBox2" runat="server"></asp:TextBox> 
     <asp:Button ID="Button1" runat="server" Text="Button" /> 
    </div> 
</form> 

código detrás:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    For Each s As String In Request.Form.AllKeys 
     Response.Write(s & ": " & Request.Form(s) & "<br />") 
    Next 
End Sub 

independiente página HTML:

<form action="http://localhost/MyTestApp/Default.aspx" method="post"> 
    <input name="TextBox1" type="text" value="" id="TextBox1" /> 
    <input name="TextBox2" type="password" id="TextBox2" /> 
    <input type="submit" name="Button1" value="Button" id="Button1" /> 
</form> 

... y regurgita los valores de forma como se esperaba. Si esto no funciona, como sugirieron otros, use una herramienta de análisis de tráfico (violinista, etéreo), porque es probable que algo no vaya donde usted está esperando.

+4

Esto no me forma en ASP.NET 4, desde la búsqueda parece que esto podría estar relacionado con Viewstate. Intenté desactivar esto, pero sin suerte todavía, el inicio de sesión todavía no ocurre. – iss42

1

Seguro que sí.

La manera más fácil de ver cómo se puede hacer esto es ir a la página aspx que desea publicar. Luego guarde la fuente de esa página como HTML. Cambia la acción del formulario en tu nueva página html para que apunte a la página aspx desde la que originalmente la copiaste.

Agregue etiquetas de valor a los campos de su formulario y coloque los datos que desea, luego abra la página y presione el botón Enviar.

1

Seguro que sí. Cree una página HTML con el formulario que contendrá los componentes necesarios de la página login.aspx (es decir, nombre de usuario, etc.) y asegúrese de que tengan los mismos ID. Para su acción, asegúrese de que sea una publicación.

Es posible que tenga que hacer un código en la página login.aspx en la función Page_Load para leer el formulario (en el objeto Request.Form) y llamar a las funciones apropiadas para iniciar sesión en el usuario, pero aparte de eso, usted debe tener acceso al formulario y puede hacer lo que quiera con él.

18

La colección Request.Form.Keys estará vacía si ninguna de las entradas de html tiene NAME. Es fácil olvidarse de ponerlos allí después de haber estado haciendo .NET por un tiempo. Solo nómbrelos y estará listo para partir.

+2

Me llevó años darme cuenta de eso. Cuando lo haces en .Net, el motor asp.net agrega automáticamente el nombre atttribute. Si creas tu formulario html 'a mano' es muy fácil olvidarlo y luego no se publica nada y te preguntas por qué. – Anthony

+1

Sí, estaba configurando el Id. Pero olvidé establecer el Nombre: S –

1

En el formulario html, debe proporcionar una variable de estado de vista adicional y deshabilitar ViewState en una página de servidor. Esto requiere un poco de control en ambos lados.

formulario HTML:

<html><body> <form id='postForm' action='WebForm.aspx' method='POST'> 
     <input type='text' name='postData' value='base-64-encoded-value' /> 
     <input type='hidden' name='__VIEWSTATE' value='' /> <!-- still need __VIEWSTATE, even empty one --> 
    </form> 

</body></html> 

Nota __VIEWSTATE vacía.

WebForm.aspx:

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="WebForm.aspx.cs" Inherits="WebForm" 
EnableEventValidation="False" EnableViewState="false" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="postForm" runat="server"> 
     <asp:TextBox ID="postData" runat="server"></asp:TextBox> 
    <div> 

    </div> 
    </form> 
</body> 
</html> 

Nota EnableEventValidation="False", EnableViewState="false" para evitar error de validación para el estado de vista vacía. Los valores de Código Detrás/Hereda no son precisos.

WebForm.cs:

public partial class WebForm : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string value = Encoding.Unicode.GetString(Convert.FromBase64String(this.postData.Text)); 
    } 
} 
0

Esperamos que esto ayude - Ponga esta etiqueta en HTML y

retire su diseño Login.aspx content..just sólo escritura directiva de página

y obtendrá los valores en la página aspx después de enviar el botón haga clic en como este- protected void Pa ge_Load (object sender, EventArgs e) {

 if (!IsPostBack) 
     { 
      CompleteRegistration(); 
     } 
    } 

CompleteRegistration public void() {

 NameValueCollection nv = Request.Form; 
     if (nv.Count != 0) 
     { 
      string strname = nv["txtbox1"]; 
      string strPwd = nv["txtbox2"]; 
     } 
    } 
Cuestiones relacionadas