2012-04-23 1 views
13

사용하여 개체를 삭제할 때) (에서 @ Html.AntiForgeryToken를 포함하는 방법 : -객체를 삭제하기위한 <code>Delete action method</code>를 호출 내가 <code>ajax.actionlink</code> 다음 한 삭제 링크

@if (!item.IsAlreadyAssigned(item.LabTestID)) 
     { 
     string i = "Are You sure You want to delete (" + @item.Description.ToString() + ") ?"; 
      @Ajax.ActionLink("Delete", 
     "Delete", "LabTest", 
     new { id = item.LabTestID }, 

new AjaxOptions 
{ Confirm = i, 
    HttpMethod = "Post", 
    OnSuccess = "deletionconfirmation", 
    OnFailure = "deletionerror" 
}) 
} 

을하지만, 거기가 할 수있는 방법입니다 @Html.AntiForgeryToken()Ajax.actionlink 삭제 호출을 포함시켜 침입자가 잘못된 삭제 요청을 보낼 수 있는지 확인하십시오.

BR

답변

16

당신은 쿠키를 설정하고 같은 값을 가진 숨겨진 필드를 방출하는 Html.AntiForgeryToken 도우미를 사용해야합니다. AJAX 요청을 보낼 때이 값을 POST 데이터에 추가해야합니다.

@Html.ActionLink(
    "Delete", 
    "Delete", 
    "LabTest", 
    new { 
     id = item.LabTestID 
    }, 
    new { 
     @class = "delete", 
     data_confirm = "Are You sure You want to delete (" + item.Description.ToString() + ") ?" 
    } 
) 

다음 (닫는 body 태그 전에 예를 들어)를 DOM에 어딘가에 숨겨진 필드를 넣어 :

그래서 내가 대신 아약스 링크의 정상적인 링크를 사용하는 것이

@Html.AntiForgeryToken() 

그리고 마지막으로는 눈에 띄지 않게 삭제 앵커 AJAXify :

$(function() { 
    $('.delete').click(function() { 
     if (!confirm($(this).data('confirm'))) { 
      return false; 
     } 

     var token = $(':input:hidden[name*="RequestVerificationToken"]'); 
     var data = { }; 
     data[token.attr('name')] = token.val(); 
     $.ajax({ 
      url: this.href, 
      type: 'POST', 
      data: data, 
      success: function (result) { 

      }, 
      error: function() { 

      } 
     }); 

     return false; 
    }); 
}); 

지금 당신이 장식 할 수 귀하 ValidateAntiForgeryToken 속성 Delete 조치 :

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int id) 
{ 
    ... 
} 
+0

답장을 보내 주셔서 감사합니다. 원래 Ajax.Actionlink?에서 이것을 정의 할 방법이 없습니다. –

+0

그리고 인터넷에서의 모든 예제가 삭제 시나리오에서 편집 방지 및 위조 방지 토큰 만 사용하는 이유는 무엇입니까 (삭제 시나리오에서는 제외). 삭제시 위조 방지 토큰을 사용하는 자습서를 보지 못했지만 시나리오, 그러니 그렇게해야합니다 (나는 그렇게해야한다고 생각합니다 !!!) –

2

답을 수정 Bronx하여이 대답과 함께

$.ajaxPrefilter(function (options, localOptions, jqXHR) { 
    var token, tokenQuery; 
    if (options.type.toLowerCase() !== 'get') { 
     token = GetAntiForgeryToken(); 
     if (options.data.indexOf(token.name)===-1) { 
      tokenQuery = token.name + '=' + token.value; 
      options.data = options.data ? (options.data + '&' + tokenQuery) 
       : tokenQuery; 
     } 
    } 
}); 

function GetAntiForgeryToken() { 
    var tokenField = $("input[type='hidden'][name$='RequestVerificationToken']"); 
    if (tokenField.length == 0) { return null; 
    } else { 
    return { 
    name: tokenField[0].name, 
    value: tokenField[0].value 
    }; 
} 

편집 죄송 Jon White로 - 실현 내가 다시 발명 여기 바퀴는 SO asp-net-mvc-antiforgerytoken-over-ajax/16495855#16495855

관련 문제