代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

对web服务进行身份验证的最佳方式是什么

  •  6
  • Pure.Krome  · 技术社区  · 16 年前

    我们有一个.net web服务api。目前,人们使用soap定义来使用api,因为我们需要通过soap头中的自定义身份验证元素进行身份验证。工作得很好。好的。

    soap要求请求是post。我们希望允许用户使用get动词(以便它可以缓存)。

    那么,提供简单get api的最佳方法是什么(不一定是webservice!)这也提供了身份验证?

    API路由示例:

    http://www.blah.com/api/Search?query=Foo

    这是一种可以接受的普遍做法吗?

    http://www.blah.com/api/Search?query=Foo&Key=<some guid>

    注意:我也不想实现ssl,也不想在iis中安装额外的软件或插件等。

    5 回复  |  直到 16 年前
        1
  •  1
  •   tvanfosson    16 年前

    如果web服务需要保护,并且我假设它需要保护,因为您当前有一个身份验证头,那么您应该重新考虑使用get而不是ssl,至少对于身份验证部分。至少我会通过ssl将授权请求发布到web服务/应用程序。如果您不想对每个请求提供身份验证,那么您将需要接受回(并在服务中生成)一个授权cookie,使用者可以将其用于后续请求。

    我将避免在url中使用身份验证,这正是您希望支持get的原因——如果url可以缓存,那么凭据也将缓存。这会破坏web服务的安全性,因为任何人都可以重用缓存的凭据。

        2
  •  1
  •   Thomas Eyde    16 年前

    如果客户端位于同一域中,则可以在IIS应用程序中启用集成Windows身份验证。您的应用程序现在只接受经过Windows身份验证的用户。添加您自己的roleprovider以获得更精细、基于角色的粒度。

        3
  •  0
  •   Vincent    16 年前

    使用get-only api,我将拥有第一个获取唯一会话id的方法。

    例如:get/api?action=auth&username=user&password=hashedPassword 将返回一个16个字符的令牌,该令牌存储在您的一侧,并且您需要在以后的每次调用中使用此唯一令牌。

    如果api是在php中完成的,那么可以使用它的php会话处理功能来实现这一点(它具有超时/垃圾收集功能)。在asp.net中也有类似的功能。

    它很容易受到重放攻击(有人抓取或猜测会话id),但如果你想要简单的东西,那就是方法。任何非https网站都会以同样的方式受到攻击。您可以将会话ID与用户的IP地址绑定,以获得额外的安全性。

        4
  •  0
  •   khebbie    16 年前

    如果您使用的是wcf,则可以在内置的安全机制上构建。如果您不想使用标准框架来实现安全性,那么您很可能会通过默默无闻来实现安全性。

        5
  •  0
  •   Rob Fuller    16 年前

    类似于thomas eyde的回答:您可以使用像siteminder这样的单一登录系统来保护url。调用者请求需要包含一个令牌,该令牌通常存储在cookie中,但可以添加到查询字符串中。

    如果不使用ssl,任何sso或web服务管理平台都会故意使身份验证变得困难。