C# 从MVC WebApp使用WebAPI后端的最佳实践

C# 从MVC WebApp使用WebAPI后端的最佳实践,c#,authentication,cookies,model-view-controller,asp.net-web-api2,C#,Authentication,Cookies,Model View Controller,Asp.net Web Api2,我正在创建一个基于WebAPI的SaaS应用程序。此WebAPI可以单独使用,无需用户界面,需要随向WebAPI发出的每个请求一起发送基本身份验证,并在调用和验证方法时返回一些对象 现在我面临一个大问题:我正在用MVC创建一个WebApp(但它可以是任何语言),我不知道如何调用我的WebAPI端点,而不需要保留用户名和密码,以便在每次调用方法时验证WebAPI请求 在这种情况下,最佳做法是什么? 我似乎找不到任何合适的解决办法 到目前为止,我已经尝试在HttpContext.Response.C

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

现在我面临一个大问题:我正在用MVC创建一个WebApp(但它可以是任何语言),我不知道如何调用我的WebAPI端点,而不需要保留用户名和密码,以便在每次调用方法时验证WebAPI请求

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

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

我还想尝试OAuth2方法,但是我找不到一个关于如何基于SQL server中的自定义用户表实现身份验证服务器的好的书面指南(Google结果列表的前五页对我没有帮助,它们确实让我对这个主题更加困惑,整个OWIN和Katana的事情…)

如果有人愿意帮助我,我可以提供进一步的信息

提前感谢,,
Stefano.

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

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

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


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

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

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

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


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

谢谢您的回复。实际上,我正试图从您提供的链接中尽可能多地学习。还有一个问题:将从服务器接收到的令牌存储在cookie的
userData
中是否是一个好的做法?之后从我的MVC前端进行调用会是什么样子我已经通过WebAPI的OAuth服务器进行了身份验证?我应该每次都在请求中传递令牌吗?再次感谢。好吧,这取决于情况。看起来您正计划创建一个web应用程序,在该应用程序中,您将是唯一一个使用该API的人,并且任何想要使用它的人都无法使用该API(即易趣的API)。如果是这样,那么我认为将该令牌作为加密值存储在数据库中会更好。毕竟,请记住,该令牌现在与临时用户名和密码相同,因此需要将其作为敏感信息进行威胁。关于请求,是的,您需要在每个请求中发送访问令牌,因此服务器将能够识别