首页 > 解决方案 > ASP.NET Web API 2 - 状态和静态范围

问题描述

我是一个相对缺乏经验的程序员。

我已经设法构建了一个使用基本身份验证的 Web api,如下所示: https://weblog.west-wind.com/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter这是工作得很好(显然是强制使用 ssl)。在 OnAuthorizeUser 内部,我通过调用一个名为“DB”的内部类来针对 mssql 数据库检查 un/pw,在该类中我的所有数据库交互都发生了。

因此,所有控制器方法都通过基本身份验证(在控制器级别“修饰”)过滤,但是,对某些控制器方法的访问也需要根据用户进行限制 - 因此需要了解用户权限。基于我以前有限的 ASP.NET 经验,我认为我会将相关的用户详细信息存储在 Session(或可能的缓存)中,但是到目前为止,我已经避开了这一点,因为我希望坚持拥有 RESTful 应用程序等的概念

对或错,在玩耍时我意识到我可以在内部数据库类中使用我的用户类的私有静态(实例?)并在初始授权时填充它。我还添加了一个公共方法(public User getThisUser())来返回私有用户。在我的 Controller 方法中,我创建了一个 DB 实例并能够检查值等。

我非常担心这个“静态”用户的“范围”会有问题,所以为了测试,我创建了一个控制器方法来简单地从 DB.getThisUser() 返回用户信息。在这样做的过程中,我发现我可以以多个不同用户的身份登录(例如同时使用不同的浏览器),并且每个用户都始终返回正确的用户信息(如已登录)。

我仍然不完全相信这是“安全的”,但是通读实现诸如 ASP.NET Identity 之类的可能替代方案的细节让我头晕目眩,在这种情况下看起来确实有点矫枉过正——我没有使用实体框架经过大量搜索后,我找不到一个不使用 ORM 的示例(我需要一个解决方案来处理现有数据库)。

这是注定要失败的吗?我要回去考虑会话还是缓存?还有什么?我非常感谢所有比我更有经验的人对此提供的任何反馈/建议。提前感谢您的帮助。

标签: asp.net-web-apistatestatic-variables

解决方案


我觉得你有点困惑。

API 应该是无状态的,这意味着没有会话。是的,您有一个可以转换为端点的控制器。

您可以使用满足请求所需的所有信息来访问端点,就是这样。不要将 API 视为所有请求都以某种方式链接的实际应用程序。相反,将其想象为一个应用程序,其中每个请求都是独立的,并且可以来自任何地方和任何用户。

应用程序如何知道哪个用户发送了请求?好吧,除非您传递该信息,否则不会。

您不会触发说 GetMeUserDetails 的请求。api不知道你想要什么。相反,您会为 userId 12345 说 GetMeUserDetails。现在,由于您的请求包含满足请求所需的所有信息,API 现在可以为您提供您所期望的。

如果某些调用需要身份验证,您可能会使用某种令牌来识别用户,但同样,信息是通过令牌传递的。

您可能已经意识到静态的含义以及它是如何工作的。在您尝试同时发送两个或更多请求之前,您不会看到问题,然后您会意识到第一个调用现在包含第二个请求的详细信息,因为好吧,静态...


推荐阅读