深入了解WCF RESTful服务并遇到以下错误:
IIS specified authentication schemes 'None', but the binding only supports
specification of exactly one authentication scheme. Valid authentication
schemes are Digest, Negotiate, NTLM, Basic, or Anonymous.
Change the IIS settings so that only a single authentication scheme is used.
以下是该方案:
我正在开发一个使用Routing从网址中删除.svc
的WCF服务。所以我可以到http://mySite/MyService
。当我启用匿名身份验证时,这非常有效。
为实现这一目标,我遵循了Steve Michelotti's tutorial on "RESTful WCF Services with No svc file and No config"。
代码分解为以下内容:
我的实际服务类是:
Imports System.ServiceModel
Imports System.ServiceModel.Web
Imports System.ServiceModel.Activation
Namespace Service
<ServiceContract()> _
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class Product
<OperationContract()> _
<WebInvoke(Method:="GET")> _
Public Function GetProducts() As String
Return "Listing ALL Products"
End Function
End Class
结束命名空间
在'Global.asax'文件中启用路由:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RouteTable.Routes.Add(New ServiceRoute("Product", New WebServiceHostFactory(), GetType(Service.Product)))
End Sub
我的'web.config'看起来像是:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="OLAPIBasicAuthModule" type="Service.ServiceValidator" />
</modules>
<security>
<authentication>
<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="false" />
<basicAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
<system.web>
<httpRuntime requestValidationMode="2.0" />
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add assembly="System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add assembly="System.Data.Services.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>
</compilation>
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
现在,要处理我遵循的基本身份验证Mike Volodarsky's tutorial on "Developing a Module Using .NET"。
这实际上给了我一个验证请求的类。
当我运行调试器时,浏览器会向我请求用户名/密码。当我输入它们然后通过我的自定义验证器验证并返回true,但是,服务调用然后失败,并在此问题的顶部出现错误。
正如我所说,如果我启用匿名身份验证一切正常。我可以访问http://mySite/Product/GetProducts
并返回我的测试字符串。
我已经在web.config中设置了许多条目来设置各种服务/绑定/行为等以启用Basic Auth,尽管它们通常会导致上述错误。
我有一种感觉,因为我正在混合技术; I.E使用路由来调用我的服务而不是使用端点等。
也就是说,我对WCF服务的理解目前非常有限。
最终,我需要能够使用路由(在URL中否定.svc)并启用基本身份验证,但拥有自己的自定义验证器,因为用户名/密码将在SQL中,而在服务器/ IIS本身没有帮助。
有什么想法吗?
哦......我也在配置中尝试了这个。:
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
仍然导致相同的错误