2010-11-11 19 views
5

我对WCF开发相当陌生,在学习框架时遇到了一些问题。我有一个服务api,它必须同时支持REST & SOAP。到目前为止,这很容易实现,特别是使用WCF4和路由。WCF - 自定义凭证和安全令牌

我目前工作的授权,并已成功通过创建两个新的管理类来扩展AuthorizationManager:“ApiKeyAuthorizationManager” &“ApiKeyAndTokenAuthorizationManager”

我的大部分服务将需要ApiKey和令牌(GUID)的在场;当初始认证时,您只需要一个有效的ApiKey和密码即可接收令牌。

到目前为止,REST与授权管理器查找查询字符串以获取ApiKey和/或令牌完美配合。

因此,例如一个服务URI会是什么样子? * http://api.domain.com/Service/Operation/ {} someVariableValue = ApiKey GUID &令牌= GUID

我的问题,现在自带授权SOAP服务电话。我已经做了一些研究,并且在实施之前得出了一些我想要验证的结论。

为了授权使用定制凭证我应该SOAP:

  1. 创建自定义的服务标识(MSDN
  2. 通过创建自定义扩展WCF SecurityTokenProvider,SecurityTokenAuthenticator和SecurityTokenSerializer(MSDN
  3. 扩展WCF通过创建自定义授权政策(MSDN

我在正确的轨道上吗?所有这些步骤都需要适合我的场景吗?似乎只是验证由两个GUID组成的凭证而进行的定制。

谢谢!


[编辑#1]

这是一个非常艰巨的任务。自定义凭证和安全令牌几乎没有记录。发现高质量的博客文章本身已被证明几乎不可能。我一直在堵塞,并且非常接近有一个工作解决方案。我甚至碰到了与this post中所述相同的路障。

当我尝试访问我的服务揭开WSDL或MEX我收到此错误:

 
The service encountered an error. 

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.InvalidOperationException: An exception was thrown in a call to a policy export extension. 
Extension: System.ServiceModel.Channels.SymmetricSecurityBindingElement 
Error: Specified argument was out of the range of valid values. 
Parameter name: parameters ----> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. 
Parameter name: parameters 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters, Boolean isOptional) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSignedSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing, AddressingVersion addressingVersion) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing) 
    at System.ServiceModel.Channels.SecurityBindingElement.ExportSymmetricSecurityBindingElement(SymmetricSecurityBindingElement binding, MetadataExporter exporter, PolicyConversionContext policyContext) 
    at System.ServiceModel.Channels.SecurityBindingElement.ExportPolicy(MetadataExporter exporter, PolicyConversionContext context) 
    at System.ServiceModel.Description.MetadataExporter.ExportPolicy(ServiceEndpoint endpoint) 
    --- End of inner ExceptionDetail stack trace --- 
    at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
    at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
    at SyncInvokeGet(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

如果您有任何想法可能是造成这个我喜欢一些帮助。


[编辑#2]

微软似乎并不想更新他们的样品展示如何支持自定义的凭据/令牌WSDL支持。 See here。 任何人都有一个想法如何得到这个工作?如果没有文档如何扩展它,那么将框架扩展到什么地步?


[编辑#3]

正如下面我的评论说...... 我有TransportWithMessageCredential工作得很好用UserNameSecurityToken。不幸的是,当我需要实施一些我已经计划好的更高级的功能时,我的服务将最终需要自定义令牌。

我正在寻找一个答案是:

如何支持定制服务的凭证和标志 WSDL支持?

目前,按照Microsoft的示例,您只能使用ChannelFactory自定义凭据并在客户端上创建自定义绑定。我宁愿不处理这件事。

如果这个问题仍然没有答案,我会继续增加奖金。只要我能完成所有工作,我就会写出一篇关于创建自定义安全解决方案所需步骤的博客教程。

+0

那么我在正确的轨道上,但这是一个非常无证的WCF区域,我觉得很惊讶。您可以按照上面提到的MSDN文章进行操作,但MS还提供解决方案文件以在此处与他们一起:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a -d8ad115a8792&displaylang = en – Daniel 2010-11-16 00:39:39

+0

我得出的结论是,创建自定义凭证和令牌的投资回报不值得我花费这么多时间。希望在未来,MS会在这方面提供一些更好的支持。 我决定用UserName消息凭证类型来做我能做的。如果有人仍然可以解决这个问题,我会留下这个问题的答案,并奖励赏金。 – Daniel 2010-11-19 04:36:15

+0

UserNameSecurityToken目前正在运行,尽管我最终需要自定义令牌,以便实现我计划的一些更高级的功能。我正在寻找的答案是“如何支持具有WSDL支持的自定义服务凭证和令牌”。如果这个问题仍然没有答案,我会继续增加奖金。 – Daniel 2010-11-19 16:47:04

回答

5

我建议你看看Windows Identity Foundation,然后向基于声明的安全/联合方向移动。该模型更好地支持自定义凭据,因为它们只是一组不同的索赔。

+0

我一直在学习WIF,并已阅读Vittorio Bertocci的这本书。但是,我不确定在这里需要创建自己的STS IdP。不过肯定会认为这是一个选项。非常感谢您的意见。 – Daniel 2010-11-26 02:07:50