我想验证。 控制器不想接收数据。 吃掉ValidateAntiForgeryToken,然后接受null。
在视图Html.AntiForgeryToken()中。
这是我的代码:
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核心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);
}
答案 0 :(得分:0)
由于您使用FormData
发送数据,因此请求的Content-Type
应该为application/form-data
。但是,正如您在浏览器的“网络”标签中看到的那样,实际数据值之间有些奇怪的值
-----WebKitFormBoundarySomeValue
这是boundary
,用于分隔数据条目。并且Content-Type
标头的实际值应为application/form-data; boundary=-----WebKitFormBoundarySomeValue
。由于此值是由浏览器随机生成的,因此您无法手动设置它,而应该省略Content-Type
标头,浏览器会为您设置它。
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)