在SQL 2008 Server和IIS 7.0中托管WCF服务时,我花了最近几天尝试解决问题。
仅当我禁用匿名身份验证并使用SSL上的基本身份验证时才会出现此问题,如下面的web.config提取中所示
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
基本上当我尝试访问MeterReadingService.svc文件时,我收到一条IIS错误,说它无法找到资源\ Account \ Login。 好像我被重定向到登录页面。 IIS上未启用表单身份验证
错误详情:
HTTP错误404.0 - 未找到 您要查找的资源已被删除,名称已更改或暂时不可用。
详细的错误信息 模块IIS Web核心 通知MapRequestHandler 处理程序StaticFile 错误代码0x80070002 请求的URL https://localhost:9011/FrontEndWS/Account/Login?ReturnUrl=%2fFrontEndWS%2fMeterReadingService.svc
物理路径D:\ WebApplications \ MeterReaderPortal \ FrontEndWS \ Account \ Login 登录方法基本 登录用户管理员
你能指出为什么会发生这种情况的指针,或者我如何记录这个错误的原因?
答案 0 :(得分:1)
您在web.config中的authentication mode
下配置了哪些system.web
?
根据您发布的错误消息,我假设它是Forms
。
要对Windows密码使用基本身份验证,System.Web.Authentication
需要如下所示:
<system.web>
<authentication mode="Windows" />
</system.web>
..和binding.security
这样:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
答案 1 :(得分:0)
我希望客户端(这是一个asp.net站点)调用wcf。两者都在我的笔记本电脑的IIS7中托管。对于WCF,我已经在IIS7中启用了基本身份验证,并且已经删除了所有其他内容。对于客户端,我已启用基本身份验证并禁用身份验证中的所有其他选项。
问题是,在这些配置下面,客户端没有从wcf获取任何数据。
如果我在浏览器中通过向服务提供网址导航到服务,那么我必须以弹出的形式输入用户名/密码。
我要做的是通过用户名和密码保护我的wcf,以便任何想要调用我的wcf的人必须提供用户名/通行证和我的wcf代码检查存在(例如在AD中)并相应地进行身份验证
我的客户端(简单的ASP.net网站调用WCF)web.config:
<configuration>
<appSettings>
<add key="userName" value="Administrator"/>
<add key="password" value="pass"/>
<!--<add key="url" value="http://localhost:57895/ListData.svc"/>-->
<!--http://localhost/WCF/-->
<add key="url" value="http://localhost:8082/ListData.svc"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
我的WCF服务web.config:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="Logging" value="true"/>
</appSettings>
<connectionStrings/>
<system.web>
<authentication mode="Windows"></authentication>
<compilation debug="true" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
<!--<webHttpBinding>
<binding name="webHttpTransportSecurity">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>-->
</bindings>
<services>
<service behaviorConfiguration="SecureRESTSvcTestBehavior" name="Hdir.ListData">
<!--<host>
<baseAddresses>
<add baseAddress="http://localhost:57895/ListData/"/>
</baseAddresses>
</host>-->
<!--webHttpBinding allows exposing service methods in a RESTful manner-->
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" behaviorConfiguration="webHttpBehavior" contract="Hdir.IListData"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<!--<behavior name=" ">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>-->
<behavior name="SecureRESTSvcTestBehavior">
<!-- To avoid disclosing metadata information, set the value below to
false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true.
Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceAuthorization serviceAuthorizationManagerType="Hdir.CustomAuthorizationManager, Hdir"/>
<!--<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Hdir.Hp.Data.CustomUserNameValidator, Hdir.Hp.Data" />
</serviceCredentials>-->
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttpBehavior">
<!--<webHttp/>-->
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<directoryBrowse enabled="true"/>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="x-requested-with"/>
<add name="Access-Control-Request-Method" value="GET"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
答案 2 :(得分:0)
我不知道是什么
<authentication mode="Windows" /> does.
我在那里添加了jsut。我不知道这是否正确。如我所说;我要做的是通过用户名和密码保护我的wcf,以便任何想要调用我的wcf的人(在任何地方使用互联网)必须提供用户名/通行证和我的wcf代码检查存在(例如在AD中)并相应地进行验证。我不知道使用wshttpbinding,webhttpbinding或basichttpbinding使用什么类型的绑定。在配置文件中看到的CustomAuthorizationManager类中,我有一个名为
的覆盖方法protected override bool CheckAccessCore(OperationContext operationContext)
{
//Extract the Authorization header, and parse out the credentials converting the Base64 string:
var authHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
if ((authHeader != null) && (authHeader != string.Empty))
{
我的问题是被调用两次,第一次有标题,代码可以验证标题,但标题为null的秒时间。不知道为什么会这样吗?