WCF用户身份验证&授权

时间:2013-09-26 11:18:36

标签: c# wcf authentication

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

EG。 " Bob使用我们的loginmethod,我们将凭据发送到身份验证服务,该服务让我们知道这些凭据是否正确。" 如果Bob发送另一个请求,我们需要知道Bob是否已经过身份验证。

现在正在客户端上创建会话,但它需要移动到服务器端。我们不能依赖客户的安全。

这可以通过使用安全cookie来解决,还是你们中有人有更好的建议?

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

Overview

1 个答案:

答案 0 :(得分:10)

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

使用WS-Trust的联盟

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

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

在这个模型中,通常的术语是:

  • 您的身份验证服务是安全令牌服务
  • 您的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中输入其凭据,身份验证服务进行身份验证,最终将令牌返回给客户端。令牌的性质不是标准化的,也不是加密的。一般来说,它至少会签名。
  • 客户端将每个请求的令牌提交给WCF服务
  • WCF服务对先前解决方案中的令牌进行身份验证

在OAuth术语中:

  • 您的身份验证服务是授权服务器
  • 您的WCF服务是资源所有者
  • 您的客户是客户

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

这适用于

  • 您的客户端规格较低或不具备加密功能(例如浏览器或某些手机)
  • 您无法控制客户端(例如,第三方应用程序正在访问您的服务)

它非常常用于互联网应用程序,您作为WCF服务的所有者并不一定了解用户或客户。在某些方面它是一个不太完整的标准(例如,它没有确切地定义身份验证的发生方式),因此,切换到备用授权服务器就不那么容易了。

它的优点是:

  • 它更简单,因此具有更广泛的平台支持
  • 它越来越受欢迎,因此图书馆支持一直在变得越来越好
  • 用户永远不会将他们的凭据输入您的用户界面,只会进入auth服务器,因此更有可能被信任(在互联网场景中)
  • 它有一种内置的方式来控制授予客户端的权限范围,并撤销这些权限,因此在互联网场景中它更受信任

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

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

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

http://dotnetopenauth.net/

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

或者,如果两个选项都不可行,你可以从一种方法借用模式,并在不使用完整标准的情况下使用它。

祝你好运!