답변:
당신은 [ValidateAntiForgeryToken]
행동하기 전에 속성이 있습니다. 또한 @Html.AntiForgeryToken()
양식에 추가해야합니다 .
Html.AntiForgeryToken();
작동하지 않습니다! 로 선반 @Html.AntiForgeryToken()
작업
필자의 경우 web.config 에이 기능이 있습니다.
<httpCookies requireSSL="true" />
그러나 내 프로젝트는 SSL을 사용하지 않도록 설정되었습니다. 해당 라인을 주석 처리하거나 항상 SSL을 사용하도록 프로젝트를 설정하면 해결되었습니다.
IIS
에는이 바인딩 ( https » EmptyHostName » IP » 443
)이 있었지만 ( )에 대한 바인딩이 없었습니다 https » www.mysite.com » IP » 443
. 그래서 도메인 이 비어 있지 않은 호스트 이름 을 가진 새로운 바인딩을 추가 하여 문제를 해결했습니다. 강제로 다시 쓰기 설정 이 있습니다. https
IIS
http 2 https
이처럼 :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
쿠키가 활성화되지 않은 경우에도 오류가 발생합니다.
요청의 일부로 파일을 업로드하는 사람들에게 또 다른 가능성. 콘텐츠 길이가 초과 <httpRuntime maxRequestLength="size in kilo bytes" />
하고 요청 확인 토큰을 사용하는 경우 브라우저는 'The required anti-forgery form field "__RequestVerificationToken" is not present'
요청 길이 초과 메시지 대신 메시지를 표시합니다 .
maxRequestLength를 요청에 맞게 충분히 큰 값으로 설정하면 즉각적인 문제가 해결되지만 적절한 해결책이 아니라는 것을 인정할 것입니다 (사용자는 요청 확인 토큰이 아닌 파일 크기의 실제 문제를 사용자가 알기를 원합니다).
제 경우에는 제출 양식 에이 자바 스크립트가 있습니다.
$('form').submit(function () {
$('input').prop('disabled', true);
});
제출 된 양식에서 숨겨진 RequestVerificationToken을 제거했습니다. 나는 그것을 다음과 같이 바꿨다.
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... 그리고 잘 작동했습니다.
readonly
숨겨진 컨트롤로 변경 하고 제외했습니다. 잘 작동하는 것 같습니다.
제 경우에는 쿠키에 대한 web.config의 잘못된 도메인이 그 이유였습니다.
<httpCookies domain=".wrong.domain.com" />
내 경우는 추가 때문 requireSSL=true
에 httpcookies
AntiForgeryToken 정지 작업을했다 webconfig에. 예:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
둘 다 requireSSL=true
만들고 @Html.AntiForgeryToken()
일 하기 위해 안에이 줄을 추가 Application_BeginRequest
했습니다.Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
개별 사용자 계정으로 ASP.NET에 대한 기본 로그인으로 Chrome 에서이 오류가 발생했습니다.
.cshtml :
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Use a local account to log in.</h4>
제어 장치:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
사이트의 사이트 데이터를 지우면 해결됩니다.
여러 컨트롤러의 EPiServer 솔루션에는 HttpGet을 허용하는 Index 작업에 ContentOutputCache 속성이 있습니다. 해당 조치에 대한 각보기에는 HttpPost 조치에 동일한 컨트롤러 또는 다른 컨트롤러에 게시하는 양식이 포함되어 있습니다. 모든 색인 작업 문제에서 해당 속성을 제거하자마자 사라졌습니다.
여기에있는 다른 모든 대답도 유효하지만 그중 어느 것도 문제를 해결하지 못하면 실제 헤더가 서버로 전달되는지 확인하는 것이 좋습니다.
예를 들어, nginx 뒤의 부하 분산 환경에서 기본 구성은 요청을 서버로 전달하기 전에 __RequestVerificationToken 헤더 를 제거하는 것입니다 . 간단한 nginx 리버스 프록시가 일부 헤더를 제거하는 것 같습니다
때로는 결과 목록과 함께 양식 조치 메소드를 작성하고 있습니다. 이 경우 하나의 조치 방법으로 작업 할 수 없습니다. 따라서 동일한 이름을 가진 두 가지 조치 방법이 있어야합니다. 하나는 특성 이 [HttpGet]
있고 다른 하나는 [HttpPost]
특성이 있습니다.
당신의에서 [HttpPost]
액션 메소드, 세트 [ValidateAntiForgeryToken]
속성과도 넣어 @Html.AntiForgeryToken()
당신의 HTML 형태로.
필자의 경우 AJAX 게시물을 작성하는 동안이 오류가 발생하여 __RequestVerificationToken 값이 호출에서 전달되지 않은 것으로 나타났습니다. 이 필드의 값을 수동으로 찾아서 엔드 포인트로 전송되는 데이터 객체의 속성으로 설정해야했습니다.
즉
data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
자바 스크립트
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
제어 장치
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
내가, 내가이 다음 한 주 광산에 싶습니다 방지 forgerytoken 튜토리얼
AngularJS와 함께 asp.net MVC 4를 사용하지만, 내가 사용 요청 예외 매번 발생 $ http.post와 난 그냥 추가되는 솔루션을 알아 냈어
'X- Requested-With ': $ http.post의 헤더에 대한 'XMLHttpRequest '(filterContext.HttpContext.Request.IsAjaxRequest())
는 아약스로 인식되지 않는 것 같습니다 . 여기 예제 코드가 있습니다.
App.js
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': $scope.token,
'Content-Type': 'application/json; charset=utf-8;'
};
$http({
method: 'POST',
url: baseURL + 'Save/User',
data: JSON.stringify($scope.formData),
headers: headers
}).then(function (values) {
alert(values.data);
}).catch(function (err) {
console.log(err.data);
});
SaveController
[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult User(UserModel usermodel)
{
....