2012-01-27 2 views
10

Orchard 1.3.10 사이트에서 테스트중인 Orchard CMS 모듈을 구축 중입니다. 이 모듈은 내 엔티티 중 하나에 대한 상세 정보보기를 표시하고 "즐겨 찾기"버튼을 클릭하고 컨트롤러 액션에 대한 아약스 게시를 수행하여 엔티티를 데이터베이스의 즐겨 찾기로 저장합니다. 나는 다음과 같은 코드가보기에 로그인 한 Orchard CMS Ajax 위조 토큰

:

<div style="padding: 10px;"> 
    <span data-id="@Model.Id" id="addFavorite" style="cursor: pointer;"> 
    [Add Favorite] 
    </span> 
</div> 

<script type="text/javascript"> 
    $("#addFavorite").click(function() { 
     alert("here we go..."); 
     $.ajax({ 
      type: "post", 
      dataType: "", 
      url: "/orchardlocal/mymodule/stuff/AddFavorite", 
      data: { id: $(this).data("id") }, 
      success: function (response) { 
       alert("it worked"); 
      } 
     }); 
    }); 
</script> 

내 컨트롤러 액션이를 ...

[HttpPost] 
public ActionResult AddFavorite(int id) 
{ 
    return View(); 
} 

나는 오차드에 로그인되지 않고 사이트 운영이 코드가 다시 게시 단지 벌금. 로그인하여 즐겨 찾기 추가를 클릭하면이 예외가 발생합니다 ...

필수 위조 토큰이 제공되지 않았거나 유효하지 않습니다.

System.Web.Mvc.HttpAntiForgeryException이 사용자 코드 에 의해 처리되지 않았습니다. 메시지 = 필수 위조 토큰이 제공되지 않았거나 유효하지 않습니다. 자료 = System.Web.WebPages ErrorCode가 = -2147467259 WebEventCode = 0 스택 트레이스 : System.Web.Helpers.AntiForgeryWorker.Validate에서 (HttpContextBase 컨텍스트 문자열 염) System.Web.Helpers.AntiForgery.Validate에서 (HttpContextBase으로 HttpContext, 문자열 염) System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization (AuthorizationContext> filterContext에서 ) Orchard.Mvc.AntiForgery.AntiForgeryAuthorizationFilter.OnAuthorization (AuthorizationContext filterContext)에서 C에서 : \ 코드 \ OrchardDev2 \ SRC \ 오차드 \ MVC \ AntiForgery \ AntiForgeryAuthorizationFilter.cs : 줄 37 at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext controllerContext, IList`1 필터, ActionDescriptor a ctionDescriptor) System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext에서 , 문자열 actionName) 의 InnerException :

로그인하지 때 왜 다르게 게시물을 치료합니까?

이것을 방지하기 위해 어떻게 위조 방지 토큰을 제공 할 수 있습니까?

감사합니다, 브라이언 내가 이것을 피하기 위해 안티 위조 토큰을 제공 할 수있는 방법

답변

23

ASP.NET MVC는 기본적으로 원시 위조 토큰 생성을 지원하지 않습니다. 다행히 Orchard는이를위한 확장 방법을 제공합니다. 그대로

당신은 간단하게 Ajax 호출을 변경할 수 있습니다

$.ajax({ 
    type: "post", 
    dataType: "", 
    url: "/orchardlocal/mymodule/stuff/AddFavorite", 
    data: { 
     id: $(this).data("id") }, 
     __RequestVerificationToken: '@Html.AntiForgeryTokenValueOrchard()' 
    }, 
    success: function (response) { 
     alert("it worked"); 
    } 
}); 

이 기술은 유용 당신이 당신의 페이지에있는 기존 양식을 필요로하지 않는. 이 솔루션은 자바 스크립트가 면도기 뷰에서 렌더링 된 경우에만 유효합니다.

@using(Script.Head()) { 
<script type="text/javascript"> 
//<![CDATA[ 
    var antiForgeryToken = '@Html.AntiForgeryTokenValueOrchard()'; 
//]]> 
</script> 
} 
: 당신이 다음보기에서 선언 된 자바 스크립트 변수 내부의 위조 방지 토큰을 저장 스크립트를 사용하는 것입니다보기에서 별도의 스크립트 파일이있는 경우

은 여전히 ​​해결책이있다 그런 다음 스크립트

는 :

data: { 
    id: $(this).data("id") }, 
    __RequestVerificationToken: antiForgeryToken 
} 

그렇지 않은 경우 다음 대린에 의해 제안 된 솔루션은 그가 올바른 방법이 될 것입니다.

+0

Sebastien, __RequestVerificationToken이 데이터 {} 안에 있어야한다는 오타가 있습니다. 맞습니까? 또한, @ Html.AntiForgeryTokenValueOrchard()를 자바 스크립트에 추가 할 때 VS에서 "구부러진 컴파일이 해제되었습니다"라는 구불 구불 한 선이 나타납니다. 나는 이것이 Razor 버그라고 말한 다른 게시물을 읽었지만 이것을해야합니다 ... @ (Html.AntiForgeryTokenValueOrchard()). 그러나, 내가 이것을 할 때 자바 스크립트 오류 "구문 오류 4"가 나타납니다. 그 밖의 무엇을 내가 여기에서 놓칠 수 있었느냐? 고마워요, Brian –

+0

나는 귀하의 의견을 –

+0

Sebastien에 설명해 주시면 답변을 완료하셨습니다. 감사! –

3

?

이것은 위조 방지 토큰이 들어있는 숨겨진 필드가 페이지에있는 위치에 따라 다릅니다. 예 :

$("#addFavorite").click(function() { 
    var token = $(':input[name="__RequestVerificationToken"]').val(); 
    $.ajax({ 
     type: "post", 
     dataType: "", 
     url: "/orchardlocal/mymodule/stuff/AddFavorite", 
     data: { 
      __RequestVerificationToken: token, 
      id: $(this).data("id") 
     }, 
     success: function (response) { 
      alert("it worked"); 
     } 
    }); 
});