Asp.net web api ASP.NET Web API 2-状态和;静态范围

Asp.net web api ASP.NET Web API 2-状态和;静态范围,asp.net-web-api,state,static-variables,Asp.net Web Api,State,Static Variables,我是一个相对缺乏经验的程序员 我已成功构建了一个使用基本身份验证的web api,如下所示: 它工作得非常好(显然是通过ssl强制的)。在OnAuthorizeUser内部,我通过调用一个名为“DB”的内部类来检查mssql数据库中的un/pw,所有数据库交互都发生在该类中 因此,所有控制器方法都通过基本身份验证进行过滤(“控制器级别的修饰”),但是,对某些控制器方法的访问也需要根据用户进行限制,因此需要了解用户权限。基于我以前有限的ASP.NET经验,我认为我应该将相关的用户详细信息存储在会话

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

我已成功构建了一个使用基本身份验证的web api,如下所示: 它工作得非常好(显然是通过ssl强制的)。在OnAuthorizeUser内部,我通过调用一个名为“DB”的内部类来检查mssql数据库中的un/pw,所有数据库交互都发生在该类中

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

无论正确与否,在玩游戏时,我意识到我可以在我的内部DB类中使用我的用户类的私有静态(实例?),并在初始授权时填充它。我还添加了一个公共方法(public User getThisUser())来返回私有用户。在我的控制器方法中,我创建了一个DB实例,并能够检查值等

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

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


这是注定要失败的吗?我要回去考虑会话或缓存吗?还有其他问题吗?我非常感谢你们所有比我更有经验的人对此提出的任何反馈/建议。提前感谢你们的帮助。

我想你们有点困惑了

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

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

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

您不会启动一个名为GetMeUserDetails的请求。api不知道您想要什么。相反,您会说GetMeUserDetails for userId 12345。现在,由于您的请求包含满足请求所需的所有信息,api现在可以为您提供所需的信息

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


您可能了解了静态的含义及其工作方式。在尝试同时发送两个或多个请求之前,您不会看到问题,然后您会意识到第一个调用现在包含了第二个请求的详细信息,因为静态…

我可能会感到困惑:)。你是说请求应该包含用户信息吗?所有方法都在auth filt后面,因此使用该信息似乎是合乎逻辑的。api“知道”用户是谁,因为他们只登录一次。也许关键在于你的评论“使用某种令牌”?我确实感到困惑的是,我如何能够同时复制两个或多个请求并得到混乱的结果。作为两个不同的用户登录到两个不同的浏览器,调用相同的方法可以正常工作。谢谢你的答复,但我想我还需要一点时间。你是对的,我可以在调用中包含userkey。例如,我有几个额外的标志限制post但允许get。这种情况是否应该发生在db而不是控制器上?当时好像是不必要的去db。