我可以仅使用 JWT 保护 MVC Core Web 应用程序吗?

Posted

技术标签:

【中文标题】我可以仅使用 JWT 保护 MVC Core Web 应用程序吗?【英文标题】:Can I secure an MVC Core web application with JWTs only? 【发布时间】: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 操作。 【参考方案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 中。

以上是关于我可以仅使用 JWT 保护 MVC Core Web 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证

使用 Razor 时如何在每个请求处传输 JWT 令牌(.NET CORE 2.2 MVC)

JWT 身份验证 ASP.NET Core MVC 应用程序

在 MVC 中使用 OAuth 持有者令牌 (JWT)

如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证

ASP.NET Core 3.1 MVC JWT 登录返回 401