2014-01-13 18 views
0

我有一個使用用戶名密碼創建令牌的控制器。如何阻止只呈現文件的請求javascript

[ChildActionOnly] 
public class TokenController : Controller 
{ 
    public JsonResult GetToken() 
    { 
     // get token from another site using username and password. 

     return Json(new{token}, JsonRequestBehavior.AllowGet); 
    } 
} 

我正在創建此令牌以使用我的其他查看頁面。 cshtml頁面包括javascript代碼這段代碼調用令牌/ GetToken操作方法。

我的家庭控制器是這樣的。

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

我的主頁索引視圖就像

<script type="text/javascript"> 

    $(document).ready(function() { 
     $.ajax({ 
      url: '/Token/Get', 
      success: function (response) { 
       console.log(response); 
      }, 
      error: function() { 
       console.log(error); 
      } 
     }); 
    }); 
</script> 

當我運行此代碼,下面的錯誤發生。 500(內部服務器錯誤)

「Get」操作只能由子請求訪問。

但有人從瀏覽器調用這個動作方法,他可以產生令牌。 http://domain.com/Token/GetToken這樣子。有人通過WebClient調用我的行爲可以產生令牌。

我不想這些情況。只有我的呈現文件JavaScript代碼應該使用我的令牌控制器。

回答

1

選項1:

只使用POST防止瀏覽器URL GET請求方法。

[HttpPost] 
public ActionResult GetToken() 
{ 
} 
jQuery中

$.post('/Token/GetToken/',{}, function(){}); 

按您的更新後

$(document).ready(function() { 
    $.ajax({ 
     url: '/Token/Get', 
     method:'post', //ADD THIS LINE 
     success: function (response) { 
      console.log(response); 
     }, 
     error: function() { 
      console.log(error); 
     } 
    }); 
}); 

選項2:

使用ChildActionOnly。這將確保url不能像瀏覽器或REST那樣直接調用。但它有一個像@Html.Action/RenderAction被訪問調用此方法和JSON結果與@Html.Raw

[ChildActionOnly] 
public ActionResult GetToken() 
{ 
} 

幫助中查看

<script type="text/javascript"> 
     var claim='@Html.Raw(Html.Action("GetToken", "Token"))'; 
    </script> 
+0

@bookmarker分配到一些JavaScript變量,更新我的回答對你 –

+0

我更新了我的帖子,但發生了同樣的錯誤。 – barteloma

+0

@bookmarker,請清楚閱讀我的答案。我給了你兩個選擇..或者在沒有childactiononly的情況下使用'POST'或者去第二個選項.. –