具有AD功能组的WCF安全性

时间:2009-12-15 20:28:56

标签: wcf wcf-security

我在Intranet上运行作为Windows服务的WCF服务,我需要检查访问该服务的用户是否属于某些AD功能组。这很简单。我可以调用[OperationContract]修饰的方法来做到这一点。但是,每次实例化服务时,是否可以强制执行此检查?我试图在服务的构造函数中调用该方法,但这似乎不起作用。

我的客户端是一个WinForms应用程序,当主窗体的构造函数不是很好时,我正在执行此安全检查。我想避免在属性中硬编码功能组名称,因为功能组可能会更改,我希望它们在WCF服务的app.config文件中指定。

我与.NET 3.0有关。

由于

3 个答案:

答案 0 :(得分:0)

默认情况下,WCF服务将是每次调用或每次会话,具体取决于您的bdingin。建议的最佳做法是按次呼叫,在这种情况下,每个请求都将:

  • 获得自己全新的独立服务类实例
  • 将实例化服务类
  • 将调用相应的服务方法,包括对操作上下文进行授权的所有检查
  • 响应将返回给调用者
  • 服务类将被处理

您可以通过将简单属性应用于服务类来实施每次调用实例化 - 实现服务合同:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class YourServiceImplementation : IYourServiceContract
{
  ...
}

点击此处了解更多主题:

Discover Mighty Instance Management Techniques For Developing WCF Apps

答案 1 :(得分:0)

我已经实现了ServiceAuthorizationManager来处理授权。但是,似乎我无法在调用ServiceAuthorizationManager方法时访问Active Directory。我的服务的Thread.CurrentPrincipal.Identity.Name为空。我怀疑在查询AD时会将其用作凭据。如果我在创建服务类之后尝试查询AD,它可以正常填充Thread.CurrentPrincipal.Identity.Name。问题是我必须在每个[OperationContract]方法中执行验证,这似乎不正确。

答案 2 :(得分:0)

我意识到这是一个古老的问题,但对于那些可能需要答案的人来说,这是我用来完成此任务的代码片段:

    public static void CheckPermissions(List<string> RequiredGroupNames)
    {
        bool ThrowException;
        WindowsIdentity MyIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity;
        WindowsPrincipal p = new WindowsPrincipal(MyIdentity);
        ThrowException = true;
        foreach (string RequiredGroupName in RequiredGroupNames)
        {
            if (p.IsInRole(RequiredGroupName))
            {
                ThrowException = false;
            }
        }
        if (ThrowException == true)
        {
            throw new FaultException(MyIdentity.Name + ": You don't have permission for this operation!");
        }
    }

我使用的是.NET 4.0,而不是使用的是3.0。但我希望有人能发现这有用。