1

我正在尝试配置一个基本的 IIS 7 托管 WCF 服务,该服务使用 Windows 身份验证来授权用户。<security mode="TransportCredentialOnly">我已经看到了许多示例,这些示例演示了如何使用带有SSL 的basicHttpBinding 来传输凭据。当我将服务配置为使用 TransportCredentialOnly 时,如果我尝试在 IE 中查看 svc 文件,则会收到以下错误:

找不到与绑定 BasicHttpBinding 的终结点的方案 http 匹配的基地址。注册的基地址方案是 [https]。

我在 IIS 7 中托管。SSL 配置了有效的证书。Windows 身份验证已打开。匿名身份验证已关闭。应用程序池是在 ApplicationPoolIdentity 下运行的 ASP.Net v4.0

这是我的服务的配置文件:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Windows" />
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
    </roleManager>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="svcTest" >
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"  />
          <serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true" httpHelpPageEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security  mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="WCF_Test.Service1" behaviorConfiguration="svcTest">
        <endpoint name ="Service1Endpoint"
                  address="EndpointTest"
                  binding="basicHttpBinding"
                  bindingConfiguration="BasicHttpEndpointBinding"
                  contract="WCF_Test.IService1">
        </endpoint>
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

如果我将绑定更改为使用Transport而不是,TransportCredentialOnly那么我可以在 IE 中查看我的服务文件。然后,我可以为我的 Web 客户端创建一个代理,并从我的客户端调用服务上的方法,并尝试使用以下代码从服务方法授权用户:

if(System.Web.Security.Roles.IsUserInRole(@"Admins"))

此代码不起作用,因为它使用在服务器上运行 IIS 的帐户的身份 (IIS APPPOOL\ASP.NET v4.0),而不是从网页调用 Web 服务的用户的身份。

  1. 如何使用有效的 SSL 证书配置 IIS 7 以使用具有安全模式 =“TransportCredentialOnly”的 basicHttpBinding?

  2. 如何将我的用户 Windows 凭据客户端流向 Web 服务,以便我可以使用此代码在 Web 服务上授权用户?

    [PrincipalPermission(SecurityAction.Demand, Role = "Admins")]

或此代码

if(System.Web.Security.Roles.IsUserInRole(@"Admins"))

任何帮助将不胜感激。

谢谢你

4

2 回答 2

0

问题可能出在 IIS 的配置中,在它到达您的代码或 web.config 之前。

如果 IIS 启用了匿名身份验证,进入 ASP.net 的请求将看起来像是来自 IIS 的用户身份。

在 IIS 配置中,您必须关闭匿名身份验证并打开 Windows 身份验证。

于 2013-02-06T20:46:40.057 回答
0

我的猜测是你需要使用 basicHttp s Binding 来代替。

于 2014-05-08T14:09:24.527 回答