MVC4剃刀。如何将javascript变量传递给服务器?

时间:2012-07-05 10:44:00

标签: javascript razor asp.net-mvc-4

我有一个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();

        });

    });

4 个答案:

答案 0 :(得分: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"]
        }
    }

答案 1 :(得分:0)

我建议您在发送ajax请求时在请求标头中向您发送访问令牌

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

在服务器端,您可以获取请求标头

答案 2 :(得分:0)

首先 - 为什么你的客户生成令牌(我希望我在那里正确理解你)?服务器应该生成令牌,然后客户端必须负责维护它。

如果它是一个API令牌,它只能在浏览器中使用javascript,那么我建议使用身份验证cookie - 所有浏览器都知道如何处理它们,如果你不再使用它们也很容易使它们在服务器端到期想要允许特定令牌访问(这是非常重要的一点)。另外,我强烈建议不要依赖服务器端会话来维护身份验证会话。

身份验证令牌理想情况下应该是无状态的(就像在Forms身份验证的cookie中一样) - 证明的负担是在客户端向您发送一个正确的令牌,该令牌包含重新初始化当前请求状态所需的信息正确的用户。

但是,如果它是任何类型客户端的通用API,那么您应该允许客户端至少在所有请求的查询字符串中向您发送令牌。您还应该支持在请求标头中使用它 - 可以轻松支持设置请求标头的客户端通常更喜欢,因为它会从URL隐藏身份验证令牌并使格式化请求更容易(还有可能最大化Web服务器的如果令牌足够大,则查询字符串限制。)

然后我建议你至少考虑重写MVC AuthorizeAttribute(对于'标准'MVC 4管道有一个 - 一个用于新的Web API管道,&amp;他们都需要如果你使用这两种技术就要完成。链接是MVC 4的一个)来破解你的cookie /标题/查询字符串值。在那里,您可以获取值,解密令牌,识别用户并设置角色。然后,该属性的核心代码包含根据用户是否经过身份验证/具有某个角色/是某个用户来拒绝请求的逻辑。

答案 3 :(得分:0)

要传回AJAX POST中的其他项目,您可以像这样添加它......

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

请记住,这仅在使用AJAX提交表单时才有效,因此不能在JavaScript不可用或禁用的情况下使用。

所有正常的安全免责声明均适用!