【问题标题】:Best practices for consuming WebAPI backend from MVC WebApp从 MVC Web App 使用 Web API 后端的最佳实践
【发布时间】:2017-07-03 20:14:38
【问题描述】:

我正在创建一个基于 WebAPI 的 SaaS 应用程序。此 WebAPI 可以单独使用,无需用户界面,需要在向 WebAPI 发出的每个请求时发送基本身份验证,并在调用和验证方法时返回一些对象。

现在我面临一个大问题:我正在 MVC 中创建一个 WebApp(但它可以是任何语言)并且我无法弄清楚如何调用我的 WebAPI 端点而不需要保留用户名和密码为了在我每次调用方法时验证 WebAPI 请求。

在这种特殊情况下,最佳做法是什么? 我似乎找不到任何合适的解决方案...

到目前为止,我已经尝试在HttpContext.Response.Cookies.Add 方法的自定义实现的帮助下创建自定义cookie,其中我将加密的用户名和密码对存储在Cookie 的userData 中。通过这种方式,我可以调用 WebAPI 方法,每次使用正确的用户名和密码指定 BasicAuthenticationCredentials,但从长远来看,这在我看来是一种非常难以维护的方式。

我也想尝试 OAuth2 方式,但我找不到关于如何基于 SQL Server 的自定义用户表实现身份验证服务器的编写良好的指南(Google 结果列表的前五页没有帮不了我,他们确实让我对这个话题更加困惑,整个 OWIN 和 Katana 的事情......)。

如果有人愿意帮助我,我可以提供更多信息。

提前致谢, 斯蒂法诺。

【问题讨论】:

标签: c# authentication cookies model-view-controller asp.net-web-api2


【解决方案1】:

这是一个关于如何实现自己的 OAuth2 服务器的好教程:

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

使用 OAuth 背后的主要思想是,您的第一个请求只需要用户名和密码,之后,您将获得一个访问令牌,用于访问 API。此访问令牌将具有生命周期,一旦过期,用户将需要请求新的访问令牌(通过再次发送用户凭据,或使用将用作凭据替代的刷新令牌)。

这种方法背后的好处是,由于访问令牌有一个生命周期,即使其中一个令牌被泄露,您也可以撤销它(或者等到它过期,例如,您可以创建将是每 5 分钟或更短的时间更新一次。这取决于你),客户会自动要求一个新的,这将是故事的结尾。另一方面,如果您总是收到用户凭据并且这些凭据被泄露,则用户将需要更改它们,并且在用户最终更改其凭据之前存在风险(这是用户需要的手动过程请注意这个问题,而 OAuth 方法只是一直刷新这些令牌)。

此外,请记住保持所有通过 HTTPS 进行的通信,因为令牌是敏感信息,并且您不希望窃听者通过截获通信来获取访问令牌或更糟的是刷新令牌。如果他能够做这样的事情,那么即使每分钟刷新一次令牌也将是一种无用的方法,因为有人得到了你发送的每一个令牌。

【讨论】:

  • 感谢您的回复。我实际上是在尝试从您提供的链接中尽可能多地学习。还有一个问题:将从服务器收到的令牌存储在 cookie 的userData 中是否是一个好习惯?在我通过 WebAPI 的 OAuth 服务器进行身份验证后,来自我的 MVC 前端的调用会是什么样的?我应该每次都在请求中传递令牌吗?再次感谢。
  • 嗯,这取决于。似乎您正计划创建一个 Web 应用程序,您将是唯一使用该 API 的人,并且它不会是任何想要使用它的人都可以使用的 API(即 Ebay 的 API)。如果是这种情况,那么我认为将该令牌作为加密值存储在数据库中会好得多。毕竟,请记住,令牌现在与临时用户名和密码相同,因此需要将其作为敏感信息进行威胁。关于请求,是的,您需要在每个请求上发送访问令牌,以便服务器能够识别您。
  • 呃,也许我解释得不好......我的意思是问将接收到的令牌存储在前端是否是一个好习惯......想象一下这个场景:你的前面-end 应用程序向 WebAPI 请求令牌,WebAPI 发送令牌供您在下一个请求中进行身份验证。当您想从前端发出请求时,您必须将之前发送给您的令牌添加到请求的标头中。此令牌可以保存在客户端的设备中以进行进一步的身份验证,直到它过期......但是这样做的最佳做法是什么?对不起文字墙:D
  • 但据我了解,您是站在消费者的角度说话,在那里您无能为力。它们可以像将该令牌存储为加密值一样安全,也可以像将其保存在便利贴中一样糟糕。这取决于他们。作为 API 使用者,我所做的是将我的令牌作为加密值存储在数据库中,因为我想要我的应用程序。使用 API 是唯一知道令牌的人。
  • 现在,如果您谈论的是用户隐式发送令牌请求,您创建该令牌并​​将其存储在其 cookie 中,这样您的应用程序将始终在没有用户的情况下获取令牌甚至不知道。那么也许 OAuth2 不是您所需要的,OAuth 对于向第三方提供对您的 API 的访问很有用,但是如果您一直是使用您的 API 的人,那么您可以使用默认的身份验证机制,您的用户可以获得经过身份验证,您存储一个会话 cookie,并验证它是否是每个请求的有效会话 cookie(MVC 中的 [Authorize] 属性)。
猜你喜欢
  • 1970-01-01
  • 2010-09-24
  • 2015-09-02
  • 2019-03-16
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多