【问题标题】:WCF Web Service Authentication based on AD groups基于 AD 组的 WCF Web 服务身份验证
【发布时间】:2009-08-25 21:06:18
【问题描述】:

我有一个 C# 客户端应用程序正在使用的 WCF Web 服务,并且我还有 4 个组存储在 Active Directory 中。客户端应用程序应通过传递登录凭据来连接此 Web 服务。

要求:

  1. 根据存储在 AD (Active Directory) 中的 Windows 用户凭据组限制 Web 服务功能
  2. 将特定用户凭据从客户端应用程序传递到此 Web 服务

问题:

如何在连接到此 Web 服务时验证或验证登录用户,将调用哪个事件处理函数来验证登录用户凭据。

如果有人知道,请告诉我

【问题讨论】:

    标签: wcf service


    【解决方案1】:

    你需要把两个概念分开:

    • AUTHENTICATION 是确定打电话给你的人的过程,并确保他确实是他声称的那个人;这可以使用用户名/密码、Windows 凭据(他已经通过登录对他的 Windows 框进行身份验证)或要求调用者提供一些信息(证书)来完成

    • AUTHORIZATION 是一个过程 - 一旦您知道谁在呼叫您,就可以确定呼叫者可以做什么(或他不能做什么)

    为了使用 Active Directory 组,您需要在 WCF 中使用支持 Windows 凭据的安全模式。最简单的方法是从一开始就使用 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,了解有关如何使用基于角色的安全性的更多详细信息。

    马克

    【讨论】:

    • 谢谢弧,让我试试你提出的解决方案。再次感谢。
    • 这太好了,谢谢。解决了我很多工作。但是,您如何捕获抛出的 SecurityException 呢?它似乎在调用方法之前被抛出,但没有在调用堆栈中传播......
    • 它被扔给客户端 - 客户端需要处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多