【问题标题】:Can I secure an MVC Core web application with JWTs only?我可以仅使用 JWT 保护 MVC Core Web 应用程序吗?
【发布时间】:2018-08-15 01:54:08
【问题描述】:

我有一个受 JWT 保护的核心 Web API,该服务由 WPF 应用程序通过HttpClient 使用。这一切都很好,因为一旦我有了一个令牌,我就会在每个请求的标头中传递它。

现在我需要构建一个使用 API 的某些功能的 MVC Core Web 应用程序。为了避免 CORS 问题,我想将 API 控制器导入 Web 应用程序。但是,我不想混合使用 cookie 和 JWT 身份验证。

通常在 WPF 应用程序中,为了登录,我向我的 API 的 Token 控制器发出请求,获取令牌并使用它来授权后续请求。现在我可以在主 MVC 应用程序中构建一个登录页面,该页面使用 HttpClient 调用我的 Token 控制器并获取 JWT,但是我如何使用该令牌来授权主 MVC 应用程序中的所有其他操作。必须使用HttpClient 来传递 JWT 标头以进行内部调用似乎也很笨拙。

有没有一种方法可以让我从一开始就使用 JWT 来保护我的 MVC 应用程序,而无需使用 HttpClient。也就是说,一旦我有了我的令牌,并且所有操作都由令牌保护,我如何存储该令牌并将其传递给主 MVC 应用程序的所有其他请求?

【问题讨论】:

  • 我需要类似的东西,我最终将 JWT 直接存储在 cookie 中。 API.Token 和 Account.Login 操作生成相同的 JWT,因此我可以使用相同的技术保护 API 方法和 Web 操作。

标签: asp.net-mvc asp.net-core asp.net-core-mvc jwt


【解决方案1】:

这取决于您是否正在构建 SPA。浏览器不会自动提供 JWT 令牌,只有 cookie 会。因此,如果您没有构建一个 SPA,您可以在其中显式发送每个请求并添加令牌,那么您需要使用 cookie 或将 JWT 存储在会话中,然后将其附加到 api 的传出请求。

为了解决 CORS 问题,我会使用 refit 之类的工具,它允许您将接口制作成样板 webrequests。这些具有扩展点,允许您在发出请求之前附加标头。

可选地,我之前使用的方法是创建一个代理控制器,该控制器处理对一个设置的 url 结构(如“api/...”)的所有请求,然后通过复制所有 body/ 将这些请求转发到 API 服务器标头到新请求中,然后将响应复制到控制器中的响应对象中,以便通过浏览器返回。这也将允许您将 JWT 注入标头。

【讨论】:

  • 我想你误会了我。我不想拥有客户端 Web 应用程序和单独的 API。我只想拥有一个 Web 应用程序,但请求使用 JWT 而不是 cookie 授权。这样一来,单独的 WPF 应用程序就可以获取 JWT 并访问 Web 应用程序中的某些 API 控制器,而不是在 API 中。
  • 正如我在答案中提到的,浏览器发起的请求不会附加 JWT 授权标头。这可以通过使您的网站成为 SPA 并让 javascript 请求您的所有页面然后将标头附加到它来完成。否则,您需要将 JWT 存储在 cookie 中。
猜你喜欢
  • 2021-05-17
  • 2021-08-04
  • 1970-01-01
  • 2016-10-19
  • 2017-11-29
  • 2021-12-03
  • 1970-01-01
  • 2016-06-02
  • 2014-05-05
相关资源
最近更新 更多