Получение формы входа .NET и отправка через Ajax - токен Anti Forgery - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть устаревший сайт, который я не могу изменить. Это ASP.Net MVC, и / login возвращает представление с формой входа и токеном CSRF.

Я настроил приложение React, в котором я хочу иметь форму, позволяющую пользователю войти в систему на стороне реакции и создать сеанс в браузере, чтобы я мог перенаправить его на устаревший сервер (с пользователемуже вошли в систему).

Поэтому я использую запрос get, чтобы получить /login.

Затем я анализирую ответ HTML и получаю токен CSRF.

Наконец я публикую /войти с именем пользователя, электронной почтой и токеном. Я протестировал этот поток с помощью PostMan, и все это работает, как и ожидалось.

Однако на странице React появляется ошибка 500 (токен не работает).

Возможно ли то, что я пытаюсь?

Вот код:

** Получить форму для входа

  getLogin = () => {
    const { email, password } = this.state;
    return new Promise((resolve, reject) => {
      fetch('...../login', {
      method: 'get',
      headers: {
        'Accept': 'text/plain, */*',
        'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
      }
    })
    .then(res => res.text())
    .then((res) => {
      resolve(res)
      this.setState({output: res})
    })
   });
  }

** Получить токен

  parseHTML = (html) => {
    return new Promise((resolve, reject) => {
      const parser = new htmlparser2.Parser({ 
        onopentag(name, attribs) {
            if (name === "input" && attribs.name === "__RequestVerificationToken") {
                const token = attribs.value;
                resolve(token)
            }
        },
      },
      { decodeEntities: true }
      );
      parser.write(html);
      parser.end();
    })
  }

** Сообщение для входа

 login = () => {
    const { email, password, token } = this.state;
    var formData = new URLSearchParams();
    formData.append('email', '......');
    formData.append('password', '......');
    formData.append('__RequestVerificationToken', token.replace(/\s/g, ""));
    const targetUrl = 'http://localhost:65055/login';
    fetch(targetUrl, {
    method: 'POST',
    headers: { 
      'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
    },
    body: formData
  })
    .then(res => res.text())
    .then(res => this.setState({output: res}));
  }
...