所以我创建了我的公共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>
答案 0 :(得分:1)
您可以通过实施基于原则的安全性来限制方法级别的访问权限,其中只允许特定组中的用户访问某些方法。
例如,MSDN演示只有角色“CalculatorClients”中的用户可以通过使用 PrincipalPermission 注释方法添加来访问此方法
[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")]
但是,这些本地帐户仍应位于您可以在前面的示例中应用的组中。对实际名称的限制对于应用程序开发来说是非常严格和静态的
请参阅MSDN上的full article。