2012-09-09 2 views
2

, JQuery와 포스트 & ASP.NET MVC 안티 ForgeryToken 검증은 내 컨트롤러에서

[HttpPost] 
     [OutputCache(CacheProfile = "Short", VaryByParam = "id", VaryByCustom = "none")] 
     [ValidateAntiForgeryToken(Salt = @ApplicationEnvironment.SALT)] 
     public ActionResult username(string id) { 
      try { 
       if (id == null || id.Length < 3) 
        return Json(false, JsonRequestBehavior.AllowGet); 

       var member = Membership.GetUser(id); 

       if (member == null) { 
        //string userPattern = @"^([a-zA-Z])[a-zA-Z_-]*[\w_-]*[\S]$|^([a-zA-Z])[0-9_-]*[\S]$|^[a-zA-Z]*[\S]$"; 
        string userPattern = "[A-Za-z][A-Za-z0-9._]{5,14}"; 
        if (Regex.IsMatch(id, userPattern)) 
         return Json(true, JsonRequestBehavior.AllowGet); 
       } 

      } catch (Exception ex) { 
       CustomErrorHandling.HandleErrorByEmail(ex, "Validate LogName()"); 
       return Json(false, JsonRequestBehavior.AllowGet); 
      } 
      //found e false 
      return Json(false, JsonRequestBehavior.AllowGet); 

     } 

내보기에 내가 게시물에 대한이 일을하고

, 나는 HTTP 가져 오기를 사용해서 getJSON 데이터를 검색 할 수 있었다. 문제는 사용자가 이름에 공백을 넣으면 유효성을 검사하지 않고 404를 제공합니다. 따라서 post 메서드를 사용하여이 작업을 수행 할 수 있다고 생각했지만 현재 사용자가 있기 때문에 내 logname을 보낼 수 없습니다. 데이터를 직렬화하여 Antiforgery 토큰을 보내는 중 ...

아무도 도와 줄 수 있습니까? 나는 감사 할 것입니다.

@{ 
    string SALT = ApplicationEnvironment.SALT; 
} 

<script type="text/javascript" defer="defer"> 
    $(function() { 
     if($("#LogName").length > 0){ 

      $("#LogName").blur(function(){ 
       var logValidate = "/Validation/username/" + $("#LogName").val(); 
       //anti-forgery token works don't need to create the input field here but if I pass the logname into the form as an input then if a user puts double quote/single quote then it will also crash.. so is there any other way around. 
       var data = $('<form>@Html.AntiForgeryToken(SALT)</form>').serialize(); 
       $.post(logValidate, data, function (json) { 
        alert(json); 
       }); 
      }); 
      $("#Email").blur(function(){ 
       var emailValidate = "/Validation/email/" + $("#Email").val(); 

       alert("got it"); 
      }); 
     } 
    }); 
</script> 

답변

0

요청을 보낼 때 jquery로 위조 방지 토큰의 가치를 지우는 것은 어떻습니까? 숨겨진 필드로 당신의 antiforgery 키 생성 다음 소스 코드에서

@Html.AntiForgeryToken() 

봐하고 "#__RequestVerificationToken"선택

var antiForgeryVal = $('#__RequestVerificationToken').val(); 
data["__RequestVerificationToken"] = antiForgeryVal ; 
$.post(logValidate, data, function (json) { 
    alert(json); 
}); 
를 조정