2012-07-05 111 views
0

我有一个JavaScript变量,我想传回服务器端,我之后打算将它用作访问令牌,以授予用户对需要此令牌的其他页面的访问权限。MVC4剃刀。如何将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(); 

     }); 

    }); 
+1

是不是你描述的只是一个身份验证cookie? – 2012-07-05 10:48:05

+0

不是。我已经创建了一个WebAPI,它需要用户先登录才能在WebAPI中使用其他内容。用户得到的是一个令牌,然后他需要使用它。我现在正在做的只是WebAPI之上的一个shell,以便用户可以访问webAPI而无需手动输入URL。 – starcorn 2012-07-05 10:51:12

+0

但是,这正是一个身份验证cookie已经达到的。你似乎已经改造了车轮。 – 2012-07-05 11:50:56

回答

0

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

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

记住,当表单使用AJAX提交,所以不到哪JavaScript不可用或禁用这仅适用。

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

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"] 
     } 
    } 
+0

我需要创建一个单独的视图来检索这个隐藏的变量? – starcorn 2012-07-05 10:47:02

+0

@starcorn:我不明白你为什么会这样做。如果它是一个隐藏的表单元素,那么它就像任何其他表单值。如果它使用的是AJAX而不是你希望的控制器动作,但结果可能是JSON,因此不需要视图。 – David 2012-07-05 10:49:08

+0

如果它只是一个隐藏的值,并且您打算将它用于多个页面,则可以在global.asax页面中放入一个钩子并从中抓取所有页面,您需要确保该名称非常漂亮独一无二,所以它不会被重新使用 – 2012-07-05 10:49:26

0

我会推荐给你发来接取令牌请求头当u被发送Ajax请求

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

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

+0

请注意:'我之后打算使用它作为访问令牌来授予用户访问需要此令牌的其他页面的权限' - 您将如何向页面请求发送此内容? – 2012-07-05 10:50:02

+0

这种方法的问题是一些代理服务器去掉自定义请求头:(但它绝对是一个不错的方法 – 2012-07-05 10:50:06

+0

我认为你需要在每个请求中传递令牌,并且在MVC端你可以编写一个动作过滤器来检查访问令牌每一个请求 – 2012-07-05 11:09:30

0

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

如果它是一个API令牌,它只会在javascript中用于浏览器,那么我建议使用一个身份验证cookie - 所有浏览器都知道如何处理它们,并且如果您不是更希望允许特定的令牌访问(这非常重要)。另外,我强烈建议不要依赖服务器端会话来维护认证会话。

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

但是,如果它是适用于任何类型客户端的通用API,那么您应该允许客户端在所有请求的查询字符串中将令牌发送给您,而且这些令牌最少。你也应该支持把它放在请求头中 - 可以很容易支持设置请求头的客户端通常更喜欢这样做,因为它然后隐藏了来自URL的认证令牌,并且使得格式请求更容易(也有可能使Web服务器查询字符串限制如果令牌足够大)。

那么我建议你看,至少,在覆盖MVCS AuthorizeAttribute(有2 - 一个用于“标准” MVC 4管线和一个新的Web API管线,&他们都需要的,如果做您正在使用这两种技术。该链接是为了MVC 4之一)来破解您的cookie/header/query字符串值。在那里你可以获得价值,解密令牌,识别用户并设置角色。然后,该属性的核心代码将包含根据用户是否已通过身份验证/具有特定角色/是否为特定用户来拒绝请求的逻辑。

相关问题