我在Intranet上运行作为Windows服务的WCF服务,我需要检查访问该服务的用户是否属于某些AD功能组。这很简单。我可以调用[OperationContract]修饰的方法来做到这一点。但是,每次实例化服务时,是否可以强制执行此检查?我试图在服务的构造函数中调用该方法,但这似乎不起作用。
我的客户端是一个WinForms应用程序,当主窗体的构造函数不是很好时,我正在执行此安全检查。我想避免在属性中硬编码功能组名称,因为功能组可能会更改,我希望它们在WCF服务的app.config文件中指定。
我与.NET 3.0有关。
由于
答案 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。但我希望有人能发现这有用。