1

Windows認証を使用してユーザーを承認する基本的なIIS7でホストされるWCFサービスを構成しようとしています。basicHttpBindingwith<security mode="TransportCredentialOnly">とSSLを使用してクレデンシャルをフローする方法を示す多くの例を見てきました。TransportCredentialOnlyを使用するようにサービスを構成する場合、IEでsvcファイルを表示しようとすると、次のエラーが発生します。

BasicHttpBindingをバインドしているエンドポイントのスキームhttpに一致するベースアドレスが見つかりませんでした。登録されているベースアドレススキームは[https]です。

IIS7でホストしています。SSLは有効な証明書で構成されています。Windows認証がオンになっています。匿名認証がオフになっています。アプリケーションプールは、ApplicationPoolIdentityで実行されているASP.Netv4.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)のIDを使用し、WebページからWebサービスを呼び出すユーザーのIDを使用しないため、機能しません。

  1. 有効なSSL証明書を使用してIIS7を構成し、セキュリティモード= "TransportCredentialOnly"でbasicHttpBindingを使用するにはどうすればよいですか?

  2. このコードを使用してWebサービスでユーザーを認証できるように、ユーザーのWindowsクレデンシャルクライアントをWebサービスにフローするにはどうすればよいですか?

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

またはこのコード

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

どんな助けでも大歓迎です。

ありがとうございました

4

2 に答える 2

0

おそらく問題は、コードまたは web.config に到達する前の IIS の構成にあります。

IIS で匿名認証がオンになっている場合、ASP.net に送信される要求は、IIS のユーザー ID から送信されたように見えます。

IIS 構成で、匿名認証をオフにし、Windows 認証をオンにする必要があります。

于 2013-02-06T20:46:40.057 に答える