Приложение ASP.NET Core Fetch POST FormData () / x-www-form-urlencoded - PullRequest
1 голос
/ 13 марта 2019

Я хочу подтвердить. Контроллер не хочет получать данные. Eat удалите ValidateAntiForgeryToken, затем примете ноль.

В представлении Html.AntiForgeryToken ().

enter image description here

Вот мой код:

getDataTable = async (e) => {
    try {
        const { Login, Password } = this.state;
        var data = new FormData();
        data.append("Login", Login);
        data.append("Password", Password);
        data.append("__RequestVerificationToken", this.props.__RequestVerificationToken);
        const response = await fetch(urlControlActionAccountLogin, {
            method: "POST", // *GET, POST, PUT, DELETE, etc.
            mode: "cors", // no-cors, cors, *same-origin
            cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
            credentials: "same-origin", // include, *same-origin, omit
            headers: {
                "Accept": "application/json, application/xml, text/plain, text/html, *.*",
                //"Content-Type": "application/json",
                "Content-Type": "application/x-www-form-urlencoded",
            },
            redirect: "follow", // manual, *follow, error
            referrer: "no-referrer", // no-referrer, *client
            body: data, // body data type must match "Content-Type" header
        });
        const json = await response.json();
        //this.setState({ textarea: json.description });
        this.setState({
            isLoaded: true,
        });
        console.log(json);
    } catch (error) {
        this.setState({
            isLoaded: true,
            error
        });
        console.error(error);
    }
};

C # Контроллер ASP.net core 2.2 JS должен отправить данные пароля для входа, и контроллер примет

[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
[AllowAnonymous]
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Login([FromForm]string _model) //[FromBody]LoginModel model
{
    var model = JsonConvert.DeserializeObject<LoginModel>(_model); //[FromForm]string _model
    //var model = _model.ToObject<LoginModel>(); //[FromForm]JObject _model
    var a = db.GetUserContext();

    if (ModelState.IsValid)
    {
        User user = await db.Users.FirstOrDefaultAsync(u => u.Login == model.Login && u.Password == model.Password);
        if (user != null)
        {
            await Authenticate(model.Login); // аутентификация

            return Json(new
            {
                user
            });
        }
        ModelState.AddModelError("", "Некорректные логин и(или) пароль");
    }
    return View(model);
}

1 Ответ

1 голос
/ 13 марта 2019

Поскольку вы отправляете данные с использованием FormData, Content-Type вашего запроса должно быть application/form-data. Но, как вы можете видеть на вкладке сети браузера, между фактическими значениями данных есть некоторые странные значения

-----WebKitFormBoundarySomeValue

Это boundary, разделяющий ваши записи данных. И фактическое значение заголовка Content-Type должно быть application/form-data; boundary=-----WebKitFormBoundarySomeValue. Так как это значение генерируется случайным образом браузером, вы не можете установить его вручную, и вам просто нужно пропустить заголовок Content-Type, broswer установит его для вас.

headers: {
    "Accept": "application/json, application/xml, text/plain, text/html, *.*"
    //no content-type
}

В коде вашего контроллера используйте атрибут [FromForm] для чтения данных запроса как данных формы. И вам следует отказаться от использования атрибута Consumes в этом случае, поскольку вы не можете указать правильное значение Content-Type, поскольку оно варьируется между запросами.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Login([FromForm]LoginModel model)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...