我正在努力想出一种自定义的身份验证方法。也就是说,用户信息在表格中,我自己在API中进行用户名和密码验证。
对于此解决方案,我尝试不使用ASP.NET标识。
在之前的项目中,我做了类似这样的事情,我将验证提供的密码,成功时,在响应cookie中返回会话GUID,然后使客户端发送此会话GUID以及对API的所有后续请求。
通过动作过滤器,然后我将使用GUID(以及发出请求的客户端的IP)在表中查找以查看会话是否仍处于活动状态并匹配在第一个会话中创建会话的IP的地方。
这次我想要的是避免在我收到API的每个请求时都要在数据库中查找。
有没有办法在服务器的内存中注册GUID令牌和其他信息?
我应该查看哪种身份验证?
答案 0 :(得分:1)
您应该查看Json Web Tokens,它是一个json对象,其中包含有关某个用户的声明 - 该对象经过哈希处理,服务器知道谁是该用户,并且不需要查看该用户数据库,它并不要求你缓存每个Guid。
答案 1 :(得分:1)
有没有办法在中注册GUID令牌和其他信息 服务器上的内存?
这不是一个好的设计。主要是,如果应用程序池回收或应用程序崩溃,所有用户都必须重新登录。
您可能需要考虑使用ASP.Net Web API内置的基于令牌的身份验证。
使用个人用户帐户创建ASP.Net Web API项目时,它会自动为您生成。
Startup.Auth.cs 文件包含用于配置 OAuth2授权服务器的代码。
如果您不喜欢使用ASP.Net Identity,可以使用自己的代码修改 ApplicationOAuthProvider 。
答案 2 :(得分:1)
唐'吨。作为Win said,如果站点的进程终止(停止运转,崩溃等),则保留所有这些令牌进程将导致问题。
如果您想避免将令牌数据存储在主SQL数据库中,您应该查看Redis或类似的程序。或者,您可以使用类似SQLite的东西来处理由文件支持的轻量级进程内数据库,但是您必须保持时间戳以手动使令牌过期(使用Redis,您可以告诉它在这么长时间后自动过期)。
我使用Redis为项目实现了auth令牌缓存,并且使用它并不是很困难,尤其是在使用Stack Exchange提供的NuGet包时。我只是将令牌映射到用户ID,但如果你愿意,你可以保留整个用户记录。
答案 3 :(得分:0)
正如一些评论所暗示的那样,我不确定我是否认为您有理由避免使用内置的身份服务/提供商。它们非常可靠,可以支持您想要做的事情。如果你真的想要,你当然可以实施自己的解决方案,但根据你在这里告诉我们的内容,我不相信这是最好的方法。
然后,您可以覆盖登录机制。用户使用用户名和密码进行身份验证后,将其令牌,其IP地址(以及您需要的任何其他识别信息)生成到您用于会话存储的任何内容中。一条评论建议查看Redis - 这是一个非常好的键/值存储速度,并避免了内存解决方案(应用程序全局对象)可能存在的粘性问题。
在您的登录回复中创建令牌cookie。
然后重写AuthorizationFilterAttribute以从cookie中获取令牌以在会话缓存中查找它,如果需要,验证IP地址是相同的。