簡體   English   中英

MVC4剃刀。 如何將JavaScript變量傳遞給服務器?

[英]MVC4 Razor. How to pass a javascript variable to server?

我有一個要傳遞回服務器端的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();

        });

    });

您不能將其作為隱藏的表單元素傳遞回去,還是不能在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"]
        }
    }

我建議您在發送ajax請求時在請求標頭中向您發送acess令牌

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

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

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

如果它是僅在JavaScript中的瀏覽器中使用的API令牌,那么我建議您使用身份驗證cookie-所有瀏覽器都知道如何處理它們,並且如果您不想再允許,也可以在服務器端輕松使它們過期要訪問的特定令牌(這很重要)。 另外,我強烈建議不要依賴服務器端會話來維護身份驗證會話。

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

但是,如果它是任何類型的客戶端的通用API,則應允許客戶端至少在所有請求的查詢字符串中向您發送令牌。 您還應該支持在請求標頭中使用它-可以輕松支持設置請求標頭的客戶端通常更喜歡這樣做,因為這樣一來,它會從URL中隱藏auth令牌,並使格式化請求更容易(還有可能最大化Web服務器的查詢字符串限制(如果令牌足夠大)。

然后,我建議您至少查看覆蓋的MVC AuthorizeAttribute (有2個-“標准” MVC 4管道有一個,新的Web API管道有一個,如果同時使用這兩個,則都需要完成該鏈接是針對MVC 4的),用於破解您的Cookie /標題/查詢字符串值。 您可以在其中獲取值,解密令牌,識別用戶並設置角色。 然后,該屬性的核心代碼包含用於基於用戶是否已通過身份驗證/具有特定角色/是否是特定用戶來拒絕請求的邏輯。

要在AJAX POST中傳回其他項目,您可以像這樣添加它...

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

請記住,這僅在使用AJAX提交表單時有效,因此在JavaScript不可用或被禁用的情況下無效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM