Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVC4剃须刀。如何将javascript变量传递给服务器?_Javascript_Razor_Asp.net Mvc 4 - Fatal编程技术网

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

MVC4剃须刀。如何将javascript变量传递给服务器?,javascript,razor,asp.net-mvc-4,Javascript,Razor,Asp.net Mvc 4,我有一个javascript变量,我希望将其传递回服务器端,然后我打算将其用作访问令牌,以授予用户对需要此令牌的其他页面的访问权限 我想知道如何将这个javascript变量传递回服务器,以便将其设置为会话变量?我是否需要使用ajax将其发回 这是我用来从服务器检索令牌的jQuery的一部分 您不能将其作为隐藏表单元素传递回去,或者在ajax回发的查询字符串中传递回去吗 在global.asmx中获取回发值的钩子示例 protected void Session_Start(object src

我有一个javascript变量,我希望将其传递回服务器端,然后我打算将其用作访问令牌,以授予用户对需要此令牌的其他页面的访问权限

我想知道如何将这个javascript变量传递回服务器,以便将其设置为会话变量?我是否需要使用ajax将其发回

这是我用来从服务器检索令牌的jQuery的一部分


您不能将其作为隐藏表单元素传递回去,或者在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');

在服务器端,您可以首先获取请求头-为什么您的客户端要生成令牌?我希望我已经正确理解了您的意思?服务器应该生成令牌,然后客户端必须负责维护令牌

如果它是一个API令牌,只能从javascript在浏览器中使用,那么我建议使用身份验证cookie——所有浏览器都知道如何处理它们,如果您不想再允许某个特定令牌访问,您还可以在服务器端轻易地使其过期,这一点非常重要。另外,我强烈建议不要依赖服务器端会话来维护身份验证会话

理想情况下,身份验证令牌应该是无状态的,就像Forms Authentication的cookie一样-举证责任在于客户端向您发送正确的令牌,该令牌包含您需要使用正确的用户重新初始化当前请求状态的信息

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


然后,我建议您至少看一下覆盖MVC有两种方法,一种是“标准”MVC4管道,另一种是新的WebAPI管道,如果您同时使用这两种技术,那么这两种方法都需要完成。该链接用于MVC4,用于破解cookie/header/query字符串值。在这里,您可以获取值、解密令牌、识别用户并设置角色。然后,该属性的核心代码包含拒绝请求的逻辑,该逻辑基于用户是否经过身份验证/是否具有特定角色/是否为特定用户。

要在AJAX帖子中传回附加项,可以这样添加它

var blargh = $(this).find('input').serialize();
blargh.someItem = "value";
请记住,这仅在使用AJAX提交表单时有效,因此在JavaScript不可用或被禁用的情况下不起作用


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

我需要创建一个单独的视图来检索这个隐藏变量吗?@starcorn:我不明白你为什么要这样做。如果它是一个隐藏的表单元素,那么它和其他表单值一样。如果它使用的是AJAX,那么您可能希望为它提供一个控制器操作,但结果可能是JSON,因此不需要任何视图。如果它只是一个隐藏值,并且您要在多个页面上使用它,那么您可以在global.asax页面上设置一个钩子,并从那里获取所有页面的钩子,您需要确保名称非常独特,因此不会重复使用。挂钩部分是否与此问题相同@JohnMitchell我添加了jQuery脚本,我首先使用它从服务器检索令牌。现在,如果我使用隐藏字段方法,我需要再次使用ajax发送令牌?您所描述的不只是一个身份验证cookie吗?不完全是。我创建了一个WebAPI,它要求用户在使用WebAPI中的其他东西之前先登录。用户得到的是一个令牌,然后需要使用它。我现在所做的只是在WebAPI上添加一个shell,这样用户就可以访问WebAPI,而无需手动输入URL。但这正是身份验证cookie已经实现的功能。“你们似乎改造了轮子。”达林迪米特罗夫我不知道认证cookie是如何使用的。但是我正在制作的shell可以驻留在其他服务器上,而不是与WebAPI位于同一服务器上。因此,我需要能够将此身份验证令牌传递给shell所在的服务器。身份验证令牌本身是由WebAPI生成的。那么,我建议您阅读表单身份验证及其使用的cookie。其思想是,匿名用户向登录方法执行第一个请求,提供其凭据,如果凭据有效,则向其提供身份验证cookie,供其在后续请求中使用
d将其用作访问令牌,以授予用户对其他需要此令牌的页面的访问权限”-您将如何为页面请求发送此令牌?此方法的问题是一些代理服务器去掉了自定义请求头:但这绝对是一种不错的方法。我认为您需要在每个请求中传递令牌,并且在MVC端您可以编写操作筛选以检查每个请求的访问令牌
var blargh = $(this).find('input').serialize();
blargh.someItem = "value";