将Ajax加载的凭据传递给Web API

时间:2014-05-28 18:11:17

标签: javascript jquery asp.net ajax asp.net-web-api

我有一个成功使用身份验证和授权的MVC站点。我试图使用jquery和load方法查询网站的api部分。我试图使用

User.Identity.GetUserId()

并且失败,因为请求未经过身份验证。带有ajax请求的页面已成功登录。是否可以访问其身份验证令牌并通过加载请求传递此值,或者我是否需要在javascript中生成新令牌?

编辑:经过一些研究,我在WebApiConfig文件中找到了这一行:

config.SuppressDefaultHostAuthentication();

是什么禁用了ajax请求的cookie验证。它使得只有令牌方法被评估。默认情况下,MVC使用cookie,而web api使用令牌。我试图利用两种不同的身份验证方案。由于cookie随着ajax请求自动发送,因此将填充User.Identity。这回答了我原来的问题。

然而,这被认为是不安全的并且允许CRSF攻击。因此,令牌是可取的。

那么,重写,你可以使用/ token端点的现有身份验证cookie来生成身份验证令牌吗?

2 个答案:

答案 0 :(得分:0)

我认为您可以执行以下步骤来实现目标:

  1. 使用jquery cookies插件或其他任何内容在客户端上读取身份验证cookie。
  2. 创建一个Web API端点来处理AJAX身份验证,该身份验证接受cookie作为正文参数。
  3. 解析身份验证cookie,从中获取用户信息并返回令牌。
  4. 将生成的令牌用于后续的请求。

答案 1 :(得分:0)

我用最少的努力找到了一个可行的解决方案。

ApplicationOAuthProvider是默认提供程序。它在/ token处提供了一个端点,您可以使用您的用户名和密码进行调用。作为回报,它提供了授权cookie,更重要的是提供了响应正文中的持票人令牌。

用户的登录流程未更改。他们访问登录表单并输入凭据。然后,它透明地调用/ token端点,返回响应令牌和cookie。然后可以使用javascript将此令牌保存到本地或会话存储:

localStorage.setItem("token", "value");

然后可以检索在同一浏览器会话中加载的任何页面。您加载此值并将其传递到ajax请求的标头中,然后使用web api进行身份验证。

如果用户指定不应记住会话存储,则使用会话存储,否则本地存储将意味着令牌更频繁可用。但是,您必须检查两个存储,并且存在令牌在到期时无效的风险。如果由ajax请求中的授权错误发出信号,则可以轻松显示消息并将用户重定向到登录页面。