我有一个由C#客户端应用程序使用的WCF Web服务,我还有4个组存储在Active Directory中。客户端应用程序应通过传递登录凭据来连接此Web服务。
要求:
问题:
如何在连接到此Web服务时对登录用户进行身份验证或验证,将调用哪个事件处理函数来验证登录的用户凭据。
如果有人知道这件事,请告诉我
答案 0 :(得分:10)
你需要将两个概念区分开来:
AUTHENTICATION 是确定是谁打电话给你的过程,并确保他真的是他声称的那个人;这可以使用用户名/密码,Windows凭据(他已经通过登录验证自己的Windows框),或者要求呼叫者获得一些信息(证书)
AUTHORIZATION 是一个过程 - 一旦你知道谁在打电话给你,确定调用者可以做什么(或者他不能做什么)
要使用Active Directory组,您需要在支持Windows凭据的WCF中使用安全模式。最简单的方法是从头开始使用Windows凭据,这是wsHttpBinding和netTcpBinding的默认值 - 在这种情况下,调用者将始终在每次调用时传递他的Windows凭据,并且您可以通过查看服务器端来检查服务器端的那些凭据。 ServiceSecurityContext.Current.WindowsIdentity
:
WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity;
这在Intranet场景中运行良好 - 无论如何,每个人都在公司防火墙后面并在他们的计算机上进行身份验证。为了实现这一点,只需使用wsHttp或netTcp绑定(在这种情况下我建议使用netTcp)。
另一个稍微复杂的情况是当您的客户端提供X.509证书时,然后您将服务器端的映射映射到网络中的现有AD用户。然而,那是相当先进的。
对您的呼叫者进行身份验证后,例如您知道谁在呼叫,您可以使用常规的基于角色的安全模型来限制权限。只需将[PrincipalPermission(....)]
属性添加到要保护的方法中,如果用户不符合任何这些要求,则抛出安全异常并且不会执行该方法。
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
[PrincipalPermission(SecurityAction.Demand, Name = "JohnDoe")]
public string SayHello(string caller)
{
......
}
你可以拥有多个“PrincipalPermission”属性,并且它们以“OR”方式匹配在一起 - 如果其中任何一个与当前调用者匹配,他将被允许进行调用。
有关如何使用基于角色的安全性的更多详细信息,请查看本文的第4页Fundamentals of WCF Security。
马克