0

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

4 回答 4

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"]
        }
    }
于 2012-07-05T10:45:02.810 回答
0

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

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

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

于 2012-07-05T10:48:41.433 回答
0

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

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

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

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

然后,我建议您至少查看覆盖AuthorizeAttributeMVC(有 2 个 - 一个用于“标准”MVC 4 管道,一个用于新的 Web API 管道,如果您同时使用这两种技术,它们都需要完成) . 该链接是为 MVC 4 之一)破解你的 cookie/header/query 字符串值。在那里,您可以获取值、解密令牌、识别用户并设置角色。然后,该属性的核心代码包含根据用户是否经过身份验证/是否具有特定角色/是否是特定用户来拒绝请求的逻辑。

于 2012-07-05T11:05:08.233 回答
0

要在 AJAX POST 中传回附加项目,您可以像这样添加它...

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

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

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

于 2012-07-08T15:45:39.807 回答