【问题标题】:Passing credentials with Ajax load to Web API将带有 Ajax 负载的凭据传递给 Web API
【发布时间】:2014-05-28 18:11:16
【问题描述】:

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

User.Identity.GetUserId()

这失败了,因为请求没有经过身份验证。带有ajax请求的页面已成功登录。是否可以访问其身份验证令牌并将其与加载请求一起传递,还是我需要在javascript中生成一个新令牌?

编辑:经过更多研究,我发现 WebApiConfig 文件中的这一行:

config.SuppressDefaultHostAuthentication();

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

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

所以,改写一下,您可以使用现有的身份验证 cookie 和 /token 端点来生成身份验证令牌吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      如果用户指定不应该记住它们,则使用会话存储,否则本地存储将意味着令牌更频繁地可用。但是,您确实必须检查这两个商店,并且存在令牌因过期而无效的风险。如果 ajax 请求中的授权错误表明这种情况发生,您可以轻松地显示一条消息并将用户重定向到登录页面。

      【讨论】:

        猜你喜欢
        • 2018-05-12
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多