ASP 후 아약스에 항변형 토큰을 포함한다.넷 MVC
위조 방지 기능에 문제가 있습니다.아약스가 들어간 토큰.ASP를 사용하고 있습니다.NET MVC 3저는 jQuery Ajax calls와 Html에서 솔루션을 시도했습니다.위조 방지토큰().이 솔루션을 사용하면 토큰이 전달됩니다.
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
        type: "POST",
        data: data,
        datatype: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        url: myURL,
        success: function (response) {
            ...
        },
        error: function (response) {
            ...
        }
    });
를 했을 때[ValidateAntiForgeryToken](토큰을 사용하여) 데이터가 파라미터로 컨트롤러에 전달되고 있는지 확인하기 위해서만 Attribute가 전달되고 있는지 확인할 수 있습니다. 어떤, '아예'는A required anti-forgery token was not supplied or was invalid.Attribute ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」
좋은 생각 있어요?
편집
위조 방지 토큰이 양식 내에서 생성되고 있지만 제출 액션을 사용하여 제출하지 않았습니다.대신 jquery를 사용하여 토큰 값을 얻은 후 이를 게시하려고 합니다.
다음은 토큰이 포함된 폼으로, 마스터 페이지 상단에 있습니다.
<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>
하셨습니다.contentType로로 합니다.application/json
다음은 작동 방법의 예입니다.
컨트롤러:
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(string someValue)
    {
        return Json(new { someValue = someValue });
    }
}
표시:
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
    @Html.AntiForgeryToken()
}
<div id="myDiv" data-url="@Url.Action("Index", "Home")">
    Click me to send an AJAX request to a controller action
    decorated with the [ValidateAntiForgeryToken] attribute
</div>
<script type="text/javascript">
    $('#myDiv').submit(function () {
        var form = $('#__AjaxAntiForgeryForm');
        var token = $('input[name="__RequestVerificationToken"]', form).val();
        $.ajax({
            url: $(this).data('url'),
            type: 'POST',
            data: { 
                __RequestVerificationToken: token, 
                someValue: 'some value' 
            },
            success: function (result) {
                alert(result.someValue);
            }
        });
        return false;
    });
</script>
또 다른 (javascriptish가 적은) 접근법은 다음과 같습니다.
먼저 HTML 도우미
public static MvcHtmlString AntiForgeryTokenForAjaxPost(this HtmlHelper helper)
{
    var antiForgeryInputTag = helper.AntiForgeryToken().ToString();
    // Above gets the following: <input name="__RequestVerificationToken" type="hidden" value="PnQE7R0MIBBAzC7SqtVvwrJpGbRvPgzWHo5dSyoSaZoabRjf9pCyzjujYBU_qKDJmwIOiPRDwBV1TNVdXFVgzAvN9_l2yt9-nf4Owif0qIDz7WRAmydVPIm6_pmJAI--wvvFQO7g0VvoFArFtAR2v6Ch1wmXCZ89v0-lNOGZLZc1" />
    var removedStart = antiForgeryInputTag.Replace(@"<input name=""__RequestVerificationToken"" type=""hidden"" value=""", "");
    var tokenValue = removedStart.Replace(@""" />", "");
    if (antiForgeryInputTag == removedStart || removedStart == tokenValue)
        throw new InvalidOperationException("Oops! The Html.AntiForgeryToken() method seems to return something I did not expect.");
    return new MvcHtmlString(string.Format(@"{0}:""{1}""", "__RequestVerificationToken", tokenValue));
}
스트링을 반환하다
__RequestVerificationToken:"P5g2D8vRyE3aBn7qQKfVVVAsQc853s-naENvpUAPZLipuw0pa_ffBf9cINzFgIRPwsf7Ykjt46ttJy5ox5r3mzpqvmgNYdnKc1125jphQV0NnM5nGFtcXXqoY3RpusTH_WcHPzH4S4l1PmB8Uu7ubZBftqFdxCLC5n-xT0fHcAY1"
이렇게 쓸 수 있게
$(function () {
    $("#submit-list").click(function () {
        $.ajax({
            url: '@Url.Action("SortDataSourceLibraries")',
            data: { items: $(".sortable").sortable('toArray'), @Html.AntiForgeryTokenForAjaxPost() },
            type: 'post',
            traditional: true
        });
    });
});
그리고 효과가 있는 것 같아요!
! 것은!!!!!!!!!!!!!!!!!!!!!@Html.AntiForgeryToken()당신의 html 코드에서 이것은 서버가 이 페이지에 서명했다는 것을 의미하며, 이 페이지에서 서버로 전송되는 각 요청에는 해커에 의해 가짜 요청이 전송되지 않도록 하는 표시가 있습니다.따라서 이 페이지가 서버에 의해 인증되기 위해서는 두 가지 단계를 거쳐야 합니다.
1. 다음 이름의 파라미터 전송한다.__RequestVerificationToken값을 얻으려면 아래의 코드를 사용합니다.
<script type="text/javascript">
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
   }
</script>
예를 들어, Ajax 콜을 수신합니다.
$.ajax({
    type: "POST",
    url: "/Account/Login",
    data: {
        __RequestVerificationToken: gettoken(),
        uname: uname,
        pass: pass
    },
    dataType: 'json',
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    success: successFu,
});
는 2단계로  수 있습니다.[ValidateAntiForgeryToken]
Asp.Net Core에서는 다음과 같이 토큰을 직접 요청할 수 있습니다.
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf    
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}
javascript에서 사용합니다.
function DoSomething(id) {
    $.post("/something/todo/"+id,
               { "__RequestVerificationToken": '@GetAntiXsrfRequestToken()' });
}
설명에 따라 권장 글로벌필터를 추가할 수 있습니다.
services.AddMvc(options =>
{
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
})
갱신하다
위의 솔루션은 .cshtml의 일부인 스크립트로 동작합니다.그렇지 않으면 직접 사용할 수 없습니다.저의 해결책은 우선 숨겨진 필드를 사용하여 값을 저장하는 것이었습니다.
 「」, 「」를 사용하고 .GetAntiXsrfRequestToken:
양식이 없는 경우:
<input type="hidden" id="RequestVerificationToken" value="@GetAntiXsrfRequestToken()">
nameAtribute를 할 수 .id여하하다
각 양식에는 이 토큰이 포함됩니다.따라서 숨김 필드에 동일한 토큰의 다른 복사본을 추가하는 대신 다음 방법으로 기존 필드를 검색할 수도 있습니다.name주의: 문서 내에는 여러 개의 양식이 있을 수 있습니다.name그런 경우엔 특별하지 않습니다.★★★★★★★★★★★★★★★와 달리id고유해야 하는 속성입니다.
스크립트에서 ID로 검색합니다.
function DoSomething(id) {
    $.post("/something/todo/"+id,
       { "__RequestVerificationToken": $('#RequestVerificationToken').val() });
}
토큰을 참조할 필요 없이 폼을 스크립트와 함께 제출하는 방법도 있습니다.
샘플 폼:
<form id="my_form" action="/something/todo/create" method="post">
</form>
토큰은 숨김 필드로 폼에 자동으로 추가됩니다.
<form id="my_form" action="/something/todo/create" method="post">
<input name="__RequestVerificationToken" type="hidden" value="Cf..." /></form>
그리고 스크립트로 제출:
function DoSomething() {
    $('#my_form').submit();
}
또는 포스트 방법을 사용합니다.
function DoSomething() {
    var form = $('#my_form');
    $.post("/something/todo/create", form.serialize());
}
에서 ASP를 사용하는 넷 MVC( 「」)@Html.AntiForgeryToken() 、 름 、 름 、 름 、 razor 、 razor 、 razor razor razor razor razor razor razor razor razor razor 。__RequestVerificationToken토큰을 저장합니다.AJAX 구현을 작성하려면 이 토큰을 직접 가져와 검증할 수 있도록 서버에 매개 변수로 전달해야 합니다.
순서 1: 토큰 취득
var token = $('input[name="`__RequestVerificationToken`"]').val();
순서 2: AJAX 콜에서 토큰을 전달하다
function registerStudent() {
var student = {     
    "FirstName": $('#fName').val(),
    "LastName": $('#lName').val(),
    "Email": $('#email').val(),
    "Phone": $('#phone').val(),
};
$.ajax({
    url: '/Student/RegisterStudent',
    type: 'POST',
    data: { 
     __RequestVerificationToken:token,
     student: student,
        },
    dataType: 'JSON',
    contentType:'application/x-www-form-urlencoded; charset=utf-8',
    success: function (response) {
        if (response.result == "Success") {
            alert('Student Registered Succesfully!')
        }
    },
    error: function (x,h,r) {
        alert('Something went wrong')
      }
})
};
참고: 콘텐츠 유형은 다음과 같습니다.'application/x-www-form-urlencoded; charset=utf-8'
Github에 프로젝트를 업로드 했으니 다운로드해서 사용해 보세요.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
Delete Personel(id) 함수 {
var data = 새로운 FormData();data.append("_RequestVerification")토큰", "@HtmlHelper"위조 방지토큰();
$.1940입력: 'POST',url: '/Personel/Delete/' + id,데이터: 데이터,캐시: false,process Data: false,내용유형: false,성공: 함수(결과) {
}});
}    
퍼블릭 스태틱클래스 HtmlHelper{퍼블릭 스태틱 문자열 GetAntiForgy토큰(){시스템.Text.RegularExpressions.일치 값 = 시스템입니다.Text.RegularExpressions.Regex.Match(시스템).Web. 도우미.위조 방지GetHtml()을 클릭합니다.ToString(), "(?:value=\")(.*)(?:\");
if (값)성공){반환값그룹 [1]가치}반환 " ,}}계정 컨트롤러:
    // POST: /Account/SendVerificationCodeSMS
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public JsonResult SendVerificationCodeSMS(string PhoneNumber)
    {
        return Json(PhoneNumber);
    }
표시 내용:
$.ajax(
{
    url: "/Account/SendVerificationCodeSMS",
    method: "POST",
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    dataType: "json",
    data: {
        PhoneNumber: $('[name="PhoneNumber"]').val(),
        __RequestVerificationToken: $('[name="__RequestVerificationToken"]').val()
    },
    success: function (data, textStatus, jqXHR) {
        if (textStatus == "success") {
            alert(data);
            // Do something on page
        }
        else {
            // Do something on page
        }
    },
    error: function (jqXHR, textStatus, errorThrown) {
        console.log(textStatus);
        console.log(jqXHR.status);
        console.log(jqXHR.statusText);
        console.log(jqXHR.responseText);
    }
});
이 중요합니다.contentType로로 합니다.'application/x-www-form-urlencoded; charset=utf-8' 그냥 하세요.contentType【속담】
오래된 질문인 거 알아요.하지만 어쨌든 제 대답을 덧붙이자면, 저 같은 사람을 도울 수 있을 거예요.
컨트롤러의 사후 처리 결과를 처리하지 않는 경우(예:LoggOff의 방법Accounts컨트롤러는 다음 버전의 @DarinDimitrov의 답변으로 할 수 있습니다.
@using (Html.BeginForm("LoggOff", "Accounts", FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
    @Html.AntiForgeryToken()
}
<!-- this could be a button -->
<a href="#" id="ajaxSubmit">Submit</a>
<script type="text/javascript">
    $('#ajaxSubmit').click(function () {
        $('#__AjaxAntiForgeryForm').submit();
        return false;
    });
</script>
저에게 해결책은 토큰을 Ajax 콜의 데이터가 아닌 헤더로 전송하는 것이었습니다.
    $.ajax({
       type: "POST",
       url: destinationUrl,
       data: someData,
       headers:{
           "RequestVerificationToken": token
       },
       dataType: "json",
       success: function (response) {
           successCallback(response);
       },
       error: function (xhr, status, error) {
          // handle failure
       }
   });
토큰이 다른 컨트롤러에서 제공된 경우 작동하지 않습니다.예를 들어 뷰가 에 의해 반환된 경우 작동하지 않습니다.Accounts컨트롤러, 단,POST에게Clients컨트롤러입니다.
나는 많은 워크라운드를 시도했지만, 그들 중 누구도 나에게 효과가 없었다.예외는 "위조 방지 필수 폼 필드"_RequestVerification"이었습니다.[ Token ](토큰)을 클릭합니다.
도움이 된 것은 .ajax 형식을 .post로 전환한 것입니다.
$.post(
    url,
    $(formId).serialize(),
    function (data) {
        $(formId).html(data);
    });
아래 기능을 자유롭게 사용하세요.
function AjaxPostWithAntiForgeryToken(destinationUrl, successCallback) {
var token = $('input[name="__RequestVerificationToken"]').val();
var headers = {};
headers["__RequestVerificationToken"] = token;
$.ajax({
    type: "POST",
    url: destinationUrl,
    data: { __RequestVerificationToken: token }, // Your other data will go here
    dataType: "json",
    success: function (response) {
        successCallback(response);
    },
    error: function (xhr, status, error) {
       // handle failure
    }
});
}
토큰 추가를 담당하는 메서드를 만듭니다.
var addAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $("[name='__RequestVerificationToken']").val();
    return data;
};
이제 이 방법을 사용하여 다음과 같은 데이터/매개변수를 작업에 전달합니다.
 var Query = $("#Query").val();
        $.ajax({
            url: '@Url.Action("GetData", "DataCheck")',
            type: "POST",
            data: addAntiForgeryToken({ Query: Query }),
            dataType: 'JSON',
            success: function (data) {
            if (data.message == "Success") {
            $('#itemtable').html(data.List);
            return false;
            }
            },
            error: function (xhr) {
            $.notify({
            message: 'Error',
            status: 'danger',
            pos: 'bottom-right'
            });
            }
            });
여기서 내 동작은 문자열 유형의 단일 매개 변수를 가집니다.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult GetData( string Query)
    {
 @using (Ajax.BeginForm("SendInvitation", "Profile",
        new AjaxOptions { HttpMethod = "POST", OnSuccess = "SendInvitationFn" },
        new { @class = "form-horizontal", id = "invitation-form" }))
    {
        @Html.AntiForgeryToken()
        <span class="red" id="invitation-result">@Html.ValidationSummary()</span>
        <div class="modal-body">
            <div class="row-fluid marg-b-15">
                <label class="block">                        
                </label>
                <input type="text" id="EmailTo" name="EmailTo" placeholder="forExample@gmail.com" value="" />
            </div>
        </div>
        <div class="modal-footer right">
            <div class="row-fluid">
                <button type="submit" class="btn btn-changepass-new">send</button>
            </div>
        </div>
    }
언급URL : https://stackoverflow.com/questions/14473597/include-antiforgerytoken-in-ajax-post-asp-net-mvc
'programing' 카테고리의 다른 글
| 사전 정의된 유형 'System'입니다.Object'가 정의되어 있지 않거나 .net 4.6을 Import하지 않았습니다. (0) | 2023.03.31 | 
|---|---|
| 응답에 useState 훅이 있는 콜백을 사용하는 방법 (0) | 2023.03.31 | 
| 플러그인의 wp_cron_event()가 cron 이벤트를 스케줄링하지 않음 (0) | 2023.03.31 | 
| jsx의 html 태그 자동 완성(하위 텍스트) (0) | 2023.03.31 | 
| 워드프레스:태그 페이지에서 태그 슬러그를 얻는 방법 (0) | 2023.03.31 |