我对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:
- 创建自定义的服务标识(MSDN)
- 通过创建自定义扩展WCF SecurityTokenProvider,SecurityTokenAuthenticator和SecurityTokenSerializer(MSDN)
- 扩展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自定义凭据并在客户端上创建自定义绑定。我宁愿不处理这件事。
如果这个问题仍然没有答案,我会继续增加奖金。只要我能完成所有工作,我就会写出一篇关于创建自定义安全解决方案所需步骤的博客教程。
那么我在正确的轨道上,但这是一个非常无证的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
我得出的结论是,创建自定义凭证和令牌的投资回报不值得我花费这么多时间。希望在未来,MS会在这方面提供一些更好的支持。 我决定用UserName消息凭证类型来做我能做的。如果有人仍然可以解决这个问题,我会留下这个问题的答案,并奖励赏金。 – Daniel 2010-11-19 04:36:15
UserNameSecurityToken目前正在运行,尽管我最终需要自定义令牌,以便实现我计划的一些更高级的功能。我正在寻找的答案是“如何支持具有WSDL支持的自定义服务凭证和令牌”。如果这个问题仍然没有答案,我会继续增加奖金。 – Daniel 2010-11-19 16:47:04