Как разместить форму со страницы HTML на странице ASPX (2.0) и прочитать значения?
В настоящее время у меня есть сайт ASP.NET, использующий поставщика членства, и все работает нормально. Пользователи могут войти в систему со страницы Login.aspx.
Теперь мы хотим, чтобы пользователи могли входить в систему непосредственно с другого веб-сайта, который в основном представляет собой статическую HTML-страницу. Пользователи должны иметь возможность ввести свое имя и пароль на этой HTML-странице и отправить его POST на мою страницу Login.aspx (где я могу затем войти в систему вручную).
Можно ли передавать значения формы из HTML в ASPX? Я все перепробовал, а коллекция Request.Form.Keys всегда пуста. Я не могу использовать HTTP GET, так как это учетные данные, которые нельзя передать в строке запроса.
Единственный известный мне способ - это iframe.
Я удивлен, что никто об этом не упомянул, но HTTP POST не более безопасен, чем GET. Я бы не рекомендовал передавать таким образом учетные данные. Здесь много идей и информации: stackoverflow.com/questions/1008668/how-secure-is-a-http-pos т





Вы уверены, что ваша HTML-форма верна и действительно ли выполняет HTTP POST? Я бы предложил запустить Fiddler2, а затем попытаться войти через свой Login.aspx, затем удаленный HTML-сайт, а затем сравнить запросы, отправленные на сервер. Для меня ASP.Net всегда работал нормально - если HTTP-запрос содержит действительный POST, я могу получить значения с помощью Request.Form ...
Это возможно очень. Я скопировал 3 страницы, которые должны дать вам подтверждение концепции:
Страница .aspx:
<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>
код позади:
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
Отдельная 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>
... и он извергает значения формы, как и ожидалось. Если это не работает, как предлагали другие, используйте инструмент анализа трафика (fiddler, ethereal), потому что что-то, вероятно, идет не так, как вы ожидаете.
Это не работает у меня в ASP.NET 4, из поиска кажется, что это может быть связано с Viewstate. Я пытался отключить это, но пока безуспешно, вход по-прежнему не происходит.
Вы, конечно, можете.
Самый простой способ узнать, как это сделать, - перейти на страницу aspx, на которой вы хотите опубликовать сообщение. Затем сохраните исходный код этой страницы как HTML. Измените действие формы на вашей новой html-странице, чтобы оно указывало на страницу aspx, с которой вы ее изначально скопировали.
Добавьте теги значений в поля формы и поместите туда нужные данные, затем откройте страницу и нажмите кнопку отправки.
Вы, конечно, можете. Создайте HTML-страницу с формой в ней, которая будет содержать необходимые компоненты со страницы login.aspx (например, имя пользователя и т. д.), И убедитесь, что у них одинаковые идентификаторы. Что касается вашего действия, убедитесь, что это сообщение.
Возможно, вам придется выполнить код на странице login.aspx в функции Page_Load, чтобы прочитать форму (в объекте Request.Form) и вызвать соответствующие функции для входа пользователя в систему, но кроме этого, у вас должен быть доступ к форму, и можете делать с ней все, что хотите.
Коллекция Request.Form.Keys будет пустой, если ни один из ваших входов html не имеет ИМЕНИ. Легко забыть поместить их туда после того, как вы какое-то время занимались .NET. Просто назовите их, и вам будет хорошо.
Мне потребовались годы, чтобы осознать это. Когда вы делаете это в .Net, движок asp.net автоматически добавляет атрибут name. Если вы создаете свою html-форму «вручную», ее очень легко забыть, и тогда ничего не публикуется, и вы задаетесь вопросом, почему.
Да, я устанавливал идентификатор, но забыл указать имя: S
В html-форме вам необходимо указать дополнительную переменную viewstate и отключить ViewState на странице сервера. Однако это требует некоторого контроля с обеих сторон.
Форма 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>
Обратите внимание на пустой __VIEWSTATE.
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>
Обратите внимание на EnableEventValidation = "False", EnableViewState = "false", чтобы предотвратить ошибку проверки для состояния пустого представления.
Значения кода позади / наследования неточны.
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));
}
}
Надеюсь, это поможет - Поместите этот тег в html и
удалите содержимое вашего дизайна login.aspx ... просто напишите только директиву страницы
и вы получите значения на странице aspx после нажатия кнопки отправки нравится- protected void Page_Load (отправитель объекта, EventArgs e) {
if (!IsPostBack)
{
CompleteRegistration();
}
}
public void CompleteRegistration () {
NameValueCollection nv = Request.Form;
if (nv.Count != 0)
{
string strname = nv["txtbox1"];
string strPwd = nv["txtbox2"];
}
}
Удалите runat = "server" части страницы публикации данных / публикации .aspx.
Разве это не то, о чем предупреждал Джефф в своей статье об атаках CSRF и XSRF? http://www.codinghorror.com/blog/archives/001175.html