【问题标题】:Web API 2 custom authenticationWeb API 2 自定义身份验证
【发布时间】:2016-04-05 15:06:51
【问题描述】:

我正在尝试提出一种自定义的身份验证方法。也就是说,用户信息在表格中,我自己在 API 中进行用户名和密码验证。

对于这个解决方案,我尝试不使用 ASP.NET Identity。

在以前的项目中,我做了类似的事情,我将验证提供的密码,成功后,在响应 cookie 中返回一个会话 GUID,然后让客户端将此会话 GUID 与所有后续请求一起发送到 API。

通过操作过滤器,然后我将使用 GUID(以及发出请求的客户端的 IP)在表中查找,以查看会话是否仍处于活动状态并匹配最初创建会话的 IP地点。

这次我希望避免在每次收到 API 请求时都在数据库中查找。

有没有办法在服务器的内存中注册 GUID 令牌和其他信息?

我应该查看哪种身份验证?

【问题讨论】:

  • 我建议您让 Identity 处理所有这些,并将其修改为仅提供自定义用户名和密码验证。除此之外,您可能会不厌其烦地创建类来处理 ConcurrentDictionary 并将您的数据存储在那里;不确定这是否是最好的方法。
  • 在网络案例中,我建议使用像 Redis 这样的分布式缓存。它是外部过程,因此您不必对某个服务器实施粘性。如果您的服务器出现故障,您的 Guid 将保留。
  • 在 Web API 中使用过滤器。创建一个继承 AuthorizationFilterAttribute 的类。这只会在到达方法之前拦截调用。如何进行身份验证完全取决于您。

标签: c# .net authentication asp.net-web-api


【解决方案1】:

不要。作为Win said,如果站点的进程终止(停机、崩溃等),将所有这些令牌保持在进程中会导致问题

如果您想避免将令牌数据存储在您的主 SQL 数据库中,您可能应该研究一下 Redis 或类似程序。或者,您可以将 SQLite 之类的东西用于由文件支持的轻量级进程内数据库,但您必须手动保留时间戳以使令牌过期(使用 Redis,您可以告诉它在很长一段时间后自动过期)。

我为一个项目使用 Redis 实现了身份验证令牌缓存,使用起来并不困难,尤其是在使用 Stack Exchange 提供的 NuGet 包时。我只是将令牌映射到用户 ID,但如果需要,您可以保留整个用户记录。

【讨论】:

    【解决方案2】:

    有没有办法注册 GUID 令牌和其他信息,在 服务器上的内存?

    这不是一个好的设计。主要是如果应用池回收或应用崩溃,所有用户都必须重新登录。

    您可能需要考虑使用 ASP.Net Web API 的内置基于令牌的身份验证。

    如何

    当您使用个人用户帐户创建 ASP.Net Web API 项目时,它会自动为您生成它。

    Startup.Auth.cs 文件包含配置OAuth2 授权服务器 的代码。

    如果您不喜欢使用 ASP.Net Identity,您可以使用自己的代码修改 ApplicationOAuthProvider

    【讨论】:

    • 我想我创建的项目没有这个选项,所以没有这样的文件。但是,我可以添加一个 OWIN Startup Class 项目。是这样吗?如果有,添加时为空。
    • 好吧。还有几个文件;您还需要覆盖 OAuthAuthorizationServerProvider。如果您不熟悉 OAuthAuthorizationServerProvider,您可能希望从自动生成的代码开始 - ApplicationOAuthProvider
    • 谢谢胜利。我最终听从了您的建议,使用了本教程:bitoftech.net/2014/06/01/…
    【解决方案3】:

    正如一些评论所暗示的,我不确定我是否有理由让您避免使用内置的身份服务/提供者。它们非常坚固,会支持你想做的事情。如果您真的愿意,您当然可以实施自己的解决方案,但根据您在这里告诉我们的内容,我不相信这是最好的方法。

    然后您可以覆盖登录机制。在用户使用用户名和密码进行身份验证后,将他们的令牌、他们的 IP 地址(以及您需要的任何其他识别信息)生成到您用于会话存储的任何内容中。一条评论建议查看 Redis - 这是一个非常好的键/值存储以提高速度,并避免内存解决方案(应用程序全局对象)可能存在的粘性问题。

    在您的登录响应中创建令牌 cookie。

    然后重写 AuthorizationFilterAttribute 以从 cookie 中获取令牌以在会话缓存中查找它,如果需要验证 IP 地址是否相同。

    【讨论】:

      【解决方案4】:

      您应该查看Json Web Tokens,它是一个 json 对象,其中包含有关某个用户的声明 - 该对象被散列并且服务器知道谁是用户并且不需要查找数据库,它没有'不需要你缓存每个 Guid。

      【讨论】:

        猜你喜欢
        • 2017-01-13
        • 2016-05-06
        • 2014-07-06
        • 2018-03-15
        • 2014-05-21
        • 2014-01-28
        • 2016-12-11
        • 1970-01-01
        • 2015-03-22
        相关资源
        最近更新 更多