Как опубликовать ФОРМУ из HTML на страницу ASPX

Как разместить форму со страницы HTML на странице ASPX (2.0) и прочитать значения?

В настоящее время у меня есть сайт ASP.NET, использующий поставщика членства, и все работает нормально. Пользователи могут войти в систему со страницы Login.aspx.

Теперь мы хотим, чтобы пользователи могли входить в систему непосредственно с другого веб-сайта, который в основном представляет собой статическую HTML-страницу. Пользователи должны иметь возможность ввести свое имя и пароль на этой HTML-странице и отправить его POST на мою страницу Login.aspx (где я могу затем войти в систему вручную).

Можно ли передавать значения формы из HTML в ASPX? Я все перепробовал, а коллекция Request.Form.Keys всегда пуста. Я не могу использовать HTTP GET, так как это учетные данные, которые нельзя передать в строке запроса.

Единственный известный мне способ - это iframe.

Разве это не то, о чем предупреждал Джефф в своей статье об атаках CSRF и XSRF? http://www.codinghorror.com/blog/archives/001175.html

Micky McQuade 17.10.2008 01:34

Я удивлен, что никто об этом не упомянул, но HTTP POST не более безопасен, чем GET. Я бы не рекомендовал передавать таким образом учетные данные. Здесь много идей и информации: stackoverflow.com/questions/1008668/how-secure-is-a-http-pos‌ т

Michael Blackburn 26.10.2012 22:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
24
2
106 178
8

Ответы 8

Вы уверены, что ваша 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. Я пытался отключить это, но пока безуспешно, вход по-прежнему не происходит.

iss42 28.11.2013 02:09

Вы, конечно, можете.

Самый простой способ узнать, как это сделать, - перейти на страницу aspx, на которой вы хотите опубликовать сообщение. Затем сохраните исходный код этой страницы как HTML. Измените действие формы на вашей новой html-странице, чтобы оно указывало на страницу aspx, с которой вы ее изначально скопировали.

Добавьте теги значений в поля формы и поместите туда нужные данные, затем откройте страницу и нажмите кнопку отправки.

Вы, конечно, можете. Создайте HTML-страницу с формой в ней, которая будет содержать необходимые компоненты со страницы login.aspx (например, имя пользователя и т. д.), И убедитесь, что у них одинаковые идентификаторы. Что касается вашего действия, убедитесь, что это сообщение.

Возможно, вам придется выполнить код на странице login.aspx в функции Page_Load, чтобы прочитать форму (в объекте Request.Form) и вызвать соответствующие функции для входа пользователя в систему, но кроме этого, у вас должен быть доступ к форму, и можете делать с ней все, что хотите.

Коллекция Request.Form.Keys будет пустой, если ни один из ваших входов html не имеет ИМЕНИ. Легко забыть поместить их туда после того, как вы какое-то время занимались .NET. Просто назовите их, и вам будет хорошо.

Мне потребовались годы, чтобы осознать это. Когда вы делаете это в .Net, движок asp.net автоматически добавляет атрибут name. Если вы создаете свою html-форму «вручную», ее очень легко забыть, и тогда ничего не публикуется, и вы задаетесь вопросом, почему.

Anthony 30.11.2009 21:45

Да, я устанавливал идентификатор, но забыл указать имя: S

Zhaph - Ben Duguid 21.09.2012 17:40

В 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.

Другие вопросы по теме