2016-01-20 64 views
6

我正在设计和测试WCF服务并将它们公开为SOAP Web服务。WCF中不同服务操作的不同安全性

我有我的服务类逻辑分裂。我有一个帐户服务。要访问帐户Web服务,您必须提供用户名和密码以及API令牌。我编写了一个扩展UserNamePasswordValidator的自定义类来关注身份验证,并编写了一个IDispatchMessageInspector来检查该令牌。

需求刚刚浮出水面,我们希望提供一些帐户检查而无需用户进行身份验证。逻辑上这些操作应该保留在账户服务中。然而,服务行为被配置为需要用户名,密码并且具有IServiceBehavior,其添加IDispatchMessageInspector来检查令牌的所有消息。

我已经通过Extending Dispatchers - MicrosoftWCF Extensibility - Carlos Figueira

审查所有不同的扩展点的我似乎可以找到一种方法,仅在操作级别应用安全。或者一种配置服务的方式,以便某些功能需要安全/令牌,而其他功能则不需要。

我是WCF的新手,所以它可能很简单,但我没有找到它。如果您知道一篇文章展示如何以不同方式保护服务的不同部分,或者您知道如何获得服务,请向我提供一些信息。谢谢。

+0

为此,您可以创建单独的端点('免费'/公共服务),无需安全或使用不同的安全设置 – SalientBrain

+0

如何限制该端点中的操作?如果没有认证,我想限制可以调用的内容。 – Allan

+0

您将终端暴露给与主要不同的特殊接口(仅限于受限制的操作) – SalientBrain

回答

1

由于您希望在操作级别允许/拒绝权限,因此您可以使用PrincipalPermission属性来设置您的方法。

你可以使用这样的:

[PrincipalPermission(SecurityAction.Demand,Authenticated=false)] 
void NotAutenticationRequiredMethod() 
[PrincipalPermission(SecurityAction.Demand,Authenticated=true)] 
void AuthenticationRequiredMethod() 

当你想要的东西更“灵活”,你也可以使用的角色,因此将不需要重新编译:

[PrincipalPermission(SecurityAction.Demand, Role = "CustomRole")] 

你可以阅读更多这里:https://msdn.microsoft.com/en-us/library/ff649821.aspx

在方法级别,你也可以检查你的OperationContext.Current.ServiceSecurityContext对象来验证请求是否来自经过身份验证的用户并作出一些决定。

记住SecurityContext中可以有不同的认证:

string primaryIdentity = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name; 

string windowsIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name; 

在这里阅读更多:https://sankarsan.wordpress.com/2010/07/25/identity-securitycallcontext-in-wcf/

希望它能帮助。

+0

谢谢。角色解决了我的问题的一部分。怎么样的令牌? 2个不同的操作需要不同的令牌才能工作。现在我正在使用IMessageInspector,但它会检查所有消息,如何在操作级别消除消息? – Allan

+0

认证数据,包括您使用OperationContext对象访问的令牌。你在MessageHeader中传递令牌吗?如果是这样,可以使用OperationContext.Current.IncomingMessageHeaders在标题的操作级读取令牌。 –