繁体   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