Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么IIS中的授权规则不限制对我的WCF服务的访问?_Wcf_Authorization_Web Config_Windows Authentication_Iis 10 - Fatal编程技术网

为什么IIS中的授权规则不限制对我的WCF服务的访问?

为什么IIS中的授权规则不限制对我的WCF服务的访问?,wcf,authorization,web-config,windows-authentication,iis-10,Wcf,Authorization,Web Config,Windows Authentication,Iis 10,我有一个独立的WCF服务托管在IIS 10中。我想将对web服务的访问限制为一组选定的用户。通过在IIS中执行以下操作,我可以为web应用程序执行此操作: 身份验证:仅Windows身份验证已禁用匿名身份验证 授权规则:允许预定义的组,即角色 但是,当我为web服务执行上述步骤并在其web.config中更改clientCredentialType=Windows时,它仍然允许域中的任何用户与它交谈。我错过了什么明显的东西吗?web服务在配置授权方面是否与web应用程序的功能不同?考虑到我的设置

我有一个独立的WCF服务托管在IIS 10中。我想将对web服务的访问限制为一组选定的用户。通过在IIS中执行以下操作,我可以为web应用程序执行此操作:

身份验证:仅Windows身份验证已禁用匿名身份验证 授权规则:允许预定义的组,即角色 但是,当我为web服务执行上述步骤并在其web.config中更改clientCredentialType=Windows时,它仍然允许域中的任何用户与它交谈。我错过了什么明显的东西吗?web服务在配置授权方面是否与web应用程序的功能不同?考虑到我的设置,我希望只有MyTestGroup中的用户能够与web服务进行通信,而其他所有用户都将获得401-未经授权

顺便说一句,我尝试设置了拒绝所有人规则,但域用户仍然可以与web服务对话,因此我觉得授权设置没有以某种方式生效。正在寻找对此的任何见解

以下是相关的web.config内容:

  <system.serviceModel>
    <services>
      <service name="StudyManagement.StudyManagement">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="secureHttpBinding" name="StudyManagement" contract="StudyManagement.IStudyManagement" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <bindings>
      <basicHttpBinding>
        <binding maxReceivedMessageSize="1048576" />
        <binding name="secureHttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" minFreeMemoryPercentageToActivateService="0" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="false" />
        <security>
            <authorization>
                <remove users="*" roles="" verbs="" />
                <add accessType="Allow" users="" roles="MyAllowGroup" />
            </authorization>
        </security>
  </system.webServer>

您可以参考此项重新创建授权规则。此外,wcf服务的授权可以使用ServiceAuthenticationmanager,

以下Microsoft文档有助于回答我的问题:

重要收获:

ASP.NET HTTP运行时处理ASP.NET请求,但不参与处理发送给WCF服务的请求,即使这些服务与ASP.NET内容托管在同一AppDomain中。相反,WCF服务模型截取发往WCF服务的消息,并通过WCF传输/通道堆栈路由它们

在AppDomain中,HTTP运行时实现的功能适用于ASP.NET内容,但不适用于WCF。ASP.NET应用程序平台的许多HTTP特定功能不适用于承载在包含ASP.NET内容的AppDomain内的WCF服务。这些功能的示例包括:

基于文件的授权:WCF安全模型不允许在决定是否授权服务请求时将访问控制列表ACL应用于服务的.svc文件

基于配置的URL授权:类似地,WCF安全模型不遵守System.Web的配置元素中指定的任何基于URL的授权规则。如果服务驻留在由ASP.NET的URL授权规则保护的URL空间中,则WCF请求将忽略这些设置

解决方案: 通过配置web.config使用ASP.NET兼容模式:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
与默认的并排配置不同,WCF承载基础结构拦截WCF消息并将其路由出HTTP管道,在ASP.NET兼容模式下运行的WCF服务完全参与ASP.NET HTTP请求生命周期。在兼容模式下,WCF服务通过IHttpHandler实现使用HTTP管道,类似于处理ASPX页面和ASMXWeb服务请求的方式。因此,就以下ASP.NET功能而言,WCF的行为与ASMX相同:

基于文件的授权:通过将文件系统访问控制列表ACL附加到服务的.svc文件,可以确保在ASP.NET兼容模式下运行的WCF服务的安全。 可配置URL授权:当WCF服务在ASP.NET兼容模式下运行时,会对WCF请求强制执行ASP.NET的URL授权规则。 我建议阅读整篇文章以获取更多信息。这是一本简短而有益的读物


感谢@Shiraz Bhaiji在上的文章参考。

感谢您的回复,但是,我的问题不是设置网页授权。那部分很好。我的问题是关于WCF服务.svc的。我真的不想走上创建自己的身份验证验证器的道路。希望只使用内置的IIS Windows身份验证/授权规则。额外的调查发现了另一个堆栈溢出问题,该问题似乎与我的问题相同,或者至少性质非常相似。多年前被问到,但没有得到任何有用的回答。这并不能让我在寻求洞察力的过程中感到有希望!