c# - WCF 用户身份验证和授权

标签 c# wcf authentication

我需要找到一种方法来验证/授权 WCF 服务中的用户。我正在使用存储用户凭据的外部身份验证服务。

例如。 “Bob 使用我们的登录方法,我们将凭据发送到身份验证服务,该服务让我们知道这些凭据是否正确。”
如果 Bob 发送另一个请求,我们需要知道 Bob 是否已经通过身份验证。

现在正在客户端上创建一个 session ,但它需要移动到服务器端。我们不能依靠客户来保证安全。

这可以通过使用安全 cookie 来解决,或者你们有更好的建议吗?

编辑!我只能使用身份验证服务器而无法访问它

Overview

最佳答案

您所描述的问题是一个众所周知的问题,它具有(至少)两个标准化解决方案。

使用 WS-Trust 的联合

第一个选项是基于 SOAP 的选项,它使用基于 WS-Trust 的主动联合。在这个解决方案中:

  • 您的客户端向身份验证服务提供凭据
  • 如果凭据有效,身份验证服务将向客户端返回一个签名(并加密)的 token 。它被加密,以便 token 中包含的任何信息都保持 secret ——即使客户端也无法读取它。它使用属于您的 WCF 服务的公钥加密。它使用属于身份验证服务的私钥进行签名。
  • 客户端将签名/加密的 token 提交给您的 WCF 服务。该服务可以解密它,因为它拥有用于解密的私钥。它可以信任它,因为它是由身份验证服务签名的。
  • 根据解密 token 的内容,服务可以建立客户端身份并做出授权决策。

  • 在这个模型中,通常的术语是:
  • 您的身份验证服务 安全 token 服务
  • 您的 WCF 服务是 信赖方
  • 您的客户是 客户

  • 这听起来很复杂,但它在使用 Windows Identity Foundation 的 .Net 和 WCF 中得到了很好的支持。有许多可用的示例,其中大部分(也许全部)可以通过 WCF 配置而不是代码来完成。

    这非常适合客户端具有加密功能(如您的 .Net 客户端)和存在良好框架(如 WIF)的场景。对于浏览器和某些手机等低规范客户端,或者您无法控制客户端的情况,这不是很好。

    它通常用于企业场景,包括企业对企业联盟。它在互联网场景中使用较少。

    它的优点是
  • 它是标准化的,因此通常得到框架的良好支持
  • 这意味着您的 WCF 服务永远不必处理客户端凭据(= 更安全)
  • 它使切换到不同的身份验证服务变得非常容易(因为它是标准化的)。例如,本地 AD 和 Windows Azure AD 都支持这一点,其他独立身份服务也是如此

  • 概述可以在这里找到:

    http://msdn.microsoft.com/en-us/magazine/ee335707.aspx

    Google 会向您展示更多的演练和示例。

    使用 OAUth 2 的联合

    在这个解决方案中:
  • 客户端显示认证服务提供的一些UI(一般是网页)
  • 用户在该 UI 中输入他们的凭据,身份验证服务进行身份验证并最终将 token 返回给客户端。 token 的性质没有标准化,也没有被加密。一般来说,它至少会被签署。
  • 客户端将 token 随每个请求提交到 WCF 服务
  • WCF 服务对 token 进行身份验证,如上一个解决方案

  • 在 OAuth 术语中:
  • 您的身份验证服务是 授权服务器
  • 您的 WCF 服务是 资源所有者
  • 您的客户是 客户

  • 同样,这听起来很复杂,但它在 .Net 中得到了相当好的支持。虽然目前可能不如 WS-Trust 方法好。它受 Windows Azure AD 和客户端支持,使用 Windows Azure 身份验证库。其他服务是否可以使用这种方法 - 例如Facebook。

    这适用于
  • 您的客户端规范低或不支持加密(例如浏览器或某些手机)
  • 您无法控制客户端(例如第三方应用程序正在访问您的服务)

  • 它在 Internet 应用程序中非常常用,您作为 WCF 服务的所有者不一定了解用户或客户端。在某些方面,它是一个不太完整的标准(例如,它没有准确定义身份验证的发生方式),因此,切换到替代授权服务器不太容易。

    它的优点是:
  • 它更简单,因此具有更广泛的平台支持
  • 它越来越受欢迎,因此库支持一直在变得更好
  • 用户永远不会将他们的凭据输入您的 UI,只会输入到身份验证服务器,因此它更有可能被信任(在 Internet 场景中)
  • 它有一个内置的方式来控制授予客户端的权限范围,并撤销这些权限,因此它在互联网场景中更受信任

  • 对此的官方 .Net 支持位于 Windows Azure AD 身份验证库中

    http://msdn.microsoft.com/en-us/library/windowsazure/jj573266.aspx

    还有其他开源组件,例如 DotNetOpenAuth

    http://dotnetopenauth.net/

    哪种解决方案最适合您主要取决于我要说的身份验证服务的性质。以及您是在企业还是互联网场景中。如果授权。服务可以很容易地适应成为 WS-Trust 安全 token 服务 (STS),那么这将是一个很好的途径。如果将一些 Web UI 添加到 auth.服务是可行的,OAuth 可能会更好。

    或者,如果两种选择都不可行,您可以从一种方法中借用模式并使用它,而无需遵循完整的标准。

    祝你好运!

    关于c# - WCF 用户身份验证和授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19026784/

    相关文章:

    c# - EF Core 3.1 - 如何使用 InMemory Provider 检测客户端评估错误?

    c# - 为什么我没有被注册为客户?

    c# - 在抽象工厂模式中使用 IoC?

    WCF 服务 - 证书未到达服务器

    javascript - Javascript API 的安全性

    c# - C# 中的计算开销 - 使用 getter/setter 与直接修改数组和转换速度

    c# - 如何为现有 WCF 服务原生启用 JSONP?

    c# - 发送大量消息时出现 SocketException(代码 10048)

    c# - 与 Web API 共享的 MVC 身份验证

    c# - 使用 Azure AD 在 ASP.NET Web 应用程序中进行身份验证