2012-07-05 110 views
0

我有一個JavaScript變量,我想傳回服務器端,我之後打算將它用作訪問令牌,以授予用戶對需要此令牌的其他頁面的訪問權限。MVC4剃刀。如何將JavaScript變量傳遞給服務器?

我想知道如何將這個javascript變量傳遞迴服務器,所以我可以將它設置爲會話變量?我需要使用ajax發回嗎?

這是jQuery的的一部分,我用它來從服務器獲取令牌

$(document).ready(function() { 
     $('#loginForm').submit(function(e) { 
      var blargh = $(this).find('input').serialize(); 

      $.ajax({ 
       type: 'post', 
       url: '/WebAPI/api/authenticate/login', 
       data: blargh, 
       success: function (data) { 
        $.each(data, function(index, token) { 
         $('#container').prepend('<input type="hidden" name="MY_HIDDEN_FIELD_NAME" id="MY_HIDDEN_FIELD_NAME" value="'+token+'">'); 
        }); 
       }, 
       error: function(jqXHR, status, errorThrown) { 
        alert("Error " + status + "\nError Thrown" + errorThrown) 
       }, 
      }); 
      e.preventDefault(); 

     }); 

    }); 
+1

是不是你描述的只是一個身份驗證cookie? – 2012-07-05 10:48:05

+0

不是。我已經創建了一個WebAPI,它需要用戶先登錄才能在WebAPI中使用其他內容。用戶得到的是一個令牌,然後他需要使用它。我現在正在做的只是WebAPI之上的一個shell,以便用戶可以訪問webAPI而無需手動輸入URL。 – starcorn 2012-07-05 10:51:12

+0

但是,這正是一個身份驗證cookie已經達到的。你似乎已經改造了車輪。 – 2012-07-05 11:50:56

回答

0

要傳回AJAX POST中的附加項目,您可以像這樣添加它...

var blargh = $(this).find('input').serialize(); 
blargh.someItem = "value"; 

記住,當表單使用AJAX提交,所以不到哪JavaScript不可用或禁用這僅適用。

所有正常的安全免責聲明適用!

0

你能不能傳遞迴無論是作爲隱藏的表單元素或傳遞迴的查詢字符串ajax回發?鉤的

實例來獲得global.asmx後回值

protected void Session_Start(object src, EventArgs e) 
    { 
     if(!string.IsNullOrEmpty(Request.Form["MY_HIDDEN_FIELD_NAME"])) 
     { 
      Session["MY_SESSION_NAME"] = Request.Form["MY_HIDDEN_FIELD_NAME"] 
     } 
    } 
+0

我需要創建一個單獨的視圖來檢索這個隱藏的變量? – starcorn 2012-07-05 10:47:02

+0

@starcorn:我不明白你爲什麼會這樣做。如果它是一個隱藏的表單元素,那麼它就像任何其他表單值。如果它使用的是AJAX而不是你希望的控制器動作,但結果可能是JSON,因此不需要視圖。 – David 2012-07-05 10:49:08

+0

如果它只是一個隱藏的值,並且您打算將它用於多個頁面,則可以在global.asax頁面中放入一個鉤子並從中抓取所有頁面,您需要確保該名稱非常漂亮獨一無二,所以它不會被重新使用 – 2012-07-05 10:49:26

0

我會推薦給你發來接取令牌請求頭當u被髮送Ajax請求

xhr.setRequestHeader('custom-header', 'value'); 

並在服務器端,您可以獲取請求標頭

+0

請注意:'我之後打算使用它作爲訪問令牌來授予用戶訪問需要此令牌的其他頁面的權限' - 您將如何向頁面請求發送此內容? – 2012-07-05 10:50:02

+0

這種方法的問題是一些代理服務器去掉自定義請求頭:(但它絕對是一個不錯的方法 – 2012-07-05 10:50:06

+0

我認爲你需要在每個請求中傳遞令牌,並且在MVC端你可以編寫一個動作過濾器來檢查訪問令牌每一個請求 – 2012-07-05 11:09:30

0

首先 - 爲什麼您的客戶端生成令牌(我希望我已經在那裏正確理解您了)?服務器應該生成令牌,然後客戶端必須負責維護它。

如果它是一個API令牌,它只會在javascript中用於瀏覽器,那麼我建議使用一個身份驗證cookie - 所有瀏覽器都知道如何處理它們,並且如果您不是更希望允許特定的令牌訪問(這非常重要)。另外,我強烈建議不要依賴服務器端會話來維護認證會話。

身份驗證令牌理想情況下應該是無狀態的(就像在Forms Authentication的cookie中一樣) - 舉證責任是在客戶端向您發送一個正確的令牌,該令牌包含您需要重新初始化當前請求狀態的信息與正確的用戶。

但是,如果它是適用於任何類型客戶端的通用API,那麼您應該允許客戶端在所有請求的查詢字符串中將令牌發送給您,而且這些令牌最少。你也應該支持把它放在請求頭中 - 可以很容易支持設置請求頭的客戶端通常更喜歡這樣做,因爲它然後隱藏了來自URL的認證令牌,並且使得格式請求更容易(也有可能使Web服務器查詢字符串限制如果令牌足夠大)。

那麼我建議你看,至少,在覆蓋MVCS AuthorizeAttribute(有2 - 一個用於「標準」 MVC 4管線和一個新的Web API管線,&他們都需要的,如果做您正在使用這兩種技術。該鏈接是爲了MVC 4之一)來破解您的cookie/header/query字符串值。在那裏你可以獲得價值,解密令牌,識別用戶並設置角色。然後,該屬性的核心代碼將包含根據用戶是否已通過身份驗證/具有特定角色/是否爲特定用戶來拒絕請求的邏輯。

相關問題