所以我已经创建了我的公共WCF服务,它是可访问的,并且它可以工作。然而,在检索wsdl中的可用方法时,我注意到有些方法对公众可用,但我不希望它们被访问。
的例子:
public interface IJobs {
List<Jobs> GetAllJobs(); //Good
}
public interface IJobManagement {
void AddNewJob(Jobs job); //Bad
}
设置<services>
<service name="Services.Data.PublishService" >
<clear/>
<endpoint address="JobsHttp" binding="basicHttpBinding" contract="Services.Data.IJobs" ></endpoint>
<endpoint address="JobsTCP" binding="netTcpBinding" contract="Services.Data.IJobManagement" />
<endpoint binding="mexHttpBinding" name="httpmex" contract="IMetadataExchange"></endpoint>
<endpoint binding="mexTcpBinding" name="mex" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:9000/"/>
<add baseAddress="net.tcp://localhost:9001"/>
</baseAddresses>
</host>
</service>
</services>
我想也许创建一个新的端点会解决我的问题,但在这个配置中它什么也没做,我知道为什么。我只是在想办法把IJobManagement从公众的视野中拿出来,让它只能在本地网络上访问。
这是我的服务类,我的方法存在于其中。
public class PublishService : IJobs, IJobsTCP { //Methods are in here. }
编辑
进一步说明,当添加新作业时,我有另一个WCF服务,它将推送到该WCF服务并修改List<Jobs>
您可以通过实现基于原则的安全性来限制方法级别的访问,其中只允许特定组中的用户访问某些方法。
例如,MSDN演示了只有角色 "CalculatorClients"中的用户可以通过用PrincipalPermission
注释方法Add来访问该方法。[PrincipalPermission(SecurityAction.Demand, Role = "CalculatorClients")]
public double Add(double a, double b)
{
return a + b;
}
您还可以通过指定主题名称和证书的指纹来限制基于客户端证书的方法,正如MSDN所演示的:
[PrincipalPermission(SecurityAction.Demand,
Name = "CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")]
public double Multiply(double a, double b)
{
return a * b;
}
要回答您关于本地帐户限制的问题,另一种选择是按帐户名称限制,例如
[PrincipalPermission(SecurityAction.Demand, Name="SomeAccountName")]
但是,这些本地帐户仍然应该在您可以在前面的示例中应用的组中。通过实际名称进行限制对您的应用程序开发是非常严格和静态的