2009-02-22 300 views
11

我在使用IIS中的WebServiceHostFactory时遇到问题。WebServiceHostFactory和IIS身份验证

“IIS指定的身份验证方案”IntegratedWindowsAuthentication,Anonymous“,但该绑定仅支持指定恰好一个身份验证方案有效的身份验证方案为摘要,协商,NTLM,基本或匿名更改IIS设置,单一认证方案被使用。“

I wanted to keep both authentication schemes and managed to do so by not using the factory but setting up the endpoint manualy in web.config.

我的问题是什么WebServiceHostFactory做得到这个结果呢?我的印象是WebServiceHostFactory会将绑定设置为我在配置中使用的同一个webHttpBinding。

编辑: 我已经看过反射器中的WebServiceHostFactory,它没有做任何聪明的事情。它只是WebServiceHost的一个简单工厂。

如果您在config中设置了端点,IIS是否还在使用服务主机?或者是WebServiceHost设置不同。

回答

3

这是为我工作。在如下所示的早期(在服务主机打开之前)添加一个虚拟端点似乎已经成功了。 (这MSDN文章暗示了这http://msdn.microsoft.com/en-us/library/bb412178.aspx)。

public class MyWebServiceHost : WebServiceHost 
{ 
    public MyWebServiceHost (Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) 
    { 
     // Inserting this dummy endpoint config seemingly does the trick: 
     AddServiceEndpoint(typeof(IMyContract), new WebHttpBinding(), string.Empty); 
    } 

    protected override void ApplyConfiguration() 
    { 
     // Typical programmatic configuration here per: 
     // http://msdn.microsoft.com/en-us/library/aa395224.aspx 
    } 
} 

我猜这可以防止WebServiceHost从创建一个默认的端点,从而关闭了一堆功能。在web.config-

1

我不确定WebServiceHostFactory,但它听起来像你在IIS内托管服务,并且它有多个选择的验证方法。如果您有IIS 5或6,请尝试进入IIS并查看包含您的服务的网站或虚拟目录的属性。转到目录安全性选项卡,单击“匿名访问和身份验证控制”下的编辑按钮,然后取消勾选“匿名访问”或“集成Windows身份验证”。我不确定IIS7。

+1

问题与那就是你再**不能调试匿名访问**网站。一个**不能令人满意的**解决方法是使用单个身份验证进行编译,然后在IIS中调试另一个身份验证之前进行调试。这有效,但时间浪费和烦人。我已经看到.NET 3.5网站多年来一直没有发生过这个问题。对于.NET 4站点,我的经验更糟。 _(有可能从MSBuild文件中改变网站身份验证,但我找不到一个现成的任务来做到这一点。)_ – 2011-09-29 02:25:47

+0

为我做了诡计,很棒的发现! – Adi 2012-02-13 16:01:36

+1

对不起,但据说他想保持两种身份验证方案......您的回答在这方面没有帮助。 – LDAdams 2012-03-01 15:32:11

1

在IIS7下,您可能找不到可以在哪里管理集成Windows身份验证设置。为了查看IIS7管理控制台中的设置,需要遵循以下文章中描述的步骤:http://msdn.microsoft.com/en-us/library/x8a5axew.aspx(标题为“错误:由于未启用集成Windows身份验证而导致调试失败”,如果链接不起作用)。

希望它有帮助。

-1

禁用安全>配置标记

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding> 
      <security mode="None"> 
      <transport clientCredentialType="Windows"/> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

那么你的WCF服务不需要身份验证...