1

私は次のインフラストラクチャを持っています:

  • コンピューター#1、Microsoft SQL Server 2008は、システムアカウントで起動しました。ログインMaster\MyLogin(Windows認証を使用)、サーバーロール= sysadm、データベースロール=がありますdb_owner

  • コンピューター#2、IIS7.0のWCFサービス。アカウントMaster\IISLogin(IISLogin@myDomain.ru)で実行されるアプリケーションとサイト

構成:

<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="CommonWindowsBinding" maxReceivedMessageSize="40000000">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <services>
      <service behaviorConfiguration="CommonBehavior" name="MyNameSpace.AdminService">
        <endpoint address="Windows" binding="netTcpBinding" bindingConfiguration="CommonWindowsBinding" name="IAdminServiceWindows" contract="MyNameSpace.IAdminService">
          <identity>
            <dns value="WCFServer" />
            <userPrincipalName value="IISLogin@myDomain.ru"/>
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
  <serviceBehaviors>
    <behavior name="CommonBehavior">
      <dataContractSerializer maxItemsInObjectGraph="10000000" />
      <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="PeerTrust" />
        </clientCertificate>
        <serviceCertificate findValue="WCFServer" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyClassFullName, MyDllFullName" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

サービスには方法があります

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public bool HasRole(string roleName)
{
     //work with database
}

最初にEF5.0データベースを使用します。接続文字列

"Data Source=Computer1; Initial Catalog=myDB; Integrated Security=True; Multipleactiveresultsets=True; Persist Security Info=True;"
  • コンピューター#3、クライアント。次の設定があります

    <configuration>
    <system.serviceModel>
      <bindings>
        <netTcpBinding>
            <binding name="CommonWindowsBinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                maxReceivedMessageSize="40000000">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
              <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="Windows" />
              </security>
            </binding>
         </netTcpBinding>
    </bindings>
    <client>
        <endpoint  name="Megatec.MasterTourService.Contracts.IAdminServiceWindows"
            address="net.tcp://Computer2:5012/IISTest/AdminService.svc/Windows"
            behaviorConfiguration="CustomBehavior"
            binding="netTcpBinding"
            bindingConfiguration="CommonWindowsBinding"
            contract="Megatec.MasterTourService.Contracts.IAdminService">
           <identity>
                <dns value="WCFServer" />
           </identity>
        </endpoint>        
    </client>
    <behaviors>         
      <behavior name="CustomBehavior">
        <dataContractSerializer maxItemsInObjectGraph="10000000"/>
        <clientCredentials>
          <clientCertificate findValue="WCFClient" x509FindType="FindBySubjectName"
              storeLocation="LocalMachine" storeName="My" />
               <serviceCertificate>
                   <defaultCertificate findValue="WCFServer" storeLocation="LocalMachine"
                                       x509FindType="FindBySubjectName" />
                   <authentication certificateValidationMode="PeerTrust" 
                                   revocationMode="NoCheck"
                                   trustedStoreLocation="LocalMachine"/>
                </serviceCertificate>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

チャネルには次の資格情報があります

channelFactory.Credentials.Windows.AllowedImpersonationLevel =
    System.Security.Principal.TokenImpersonationLevel.Delegation;
channelFactory.Credentials.Windows.ClientCredential =
    System.Net.CredentialCache.DefaultNetworkCredentials;

dbエラーで落ちる

ユーザー「NTAUTHORITY\Anonymous」のログインに失敗しました

したがって、WCF委任にはいくつかの問題があります。単純な認証を使おうとするとusername/password、うまくいきました。つまり、証明書などは問題ありません。

この命令でステップ4を実行しましたが、機能しません。

たぶん私のコードや設定に何か問題がありますか?どうすれば修正できますか?

更新

  1. 試しました(結果なし)

    [OperationBehavior(Impersonation = ImpersonationOption.Allowed)] => [OperationBehavior(Impersonation = ImpersonationOption.Required)]

  2. 試しました(結果なし)

  3. サービス側

    ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel =偽装(委任ではありません!)

  4. IISプールのIDをApplicationPoolIdentityからIISLogin@myDomain.ruに変更しようとすると、コンピューター3のクライアントがクラッシュしました。

4

2 に答える 2

1

computer3の構成で、(現在の<behaviors>...</behaviors>ブロックの代わりに)次のことを試してください。

<behaviors>
  <endpointBehaviors>
    <behavior name="CustomBehavior">
      <clientCredentials>
        <!--<windows allowNtlm="false" allowedImpersonationLevel="Delegation" />-->
        <windows allowNtlm="true" allowedImpersonationLevel="Delegation" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

編集:「すべてのタイプ」(Kerberosだけでなく)でComputer1への資格情報の委任を許可するためにComputer2でActiveDirectoryレコードを設定する必要がある場合もあります

于 2012-10-29T12:09:07.500 に答える
0

残念ながら、Transport/TransportWithMessageCredential セキュリティ モードは、クライアントの資格情報と委任によるこのような作業をサポートしていません。私はCommonWindowsBinding次のように変更しました

サーバ

    <binding name="CommonWindowsBinding" maxReceivedMessageSize="40000000">
      <security mode="Message">
        <message clientCredentialType="Windows" />
      </security>
    </binding>

クライアント

    <binding name="CommonWindowsBinding" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
        hostNameComparisonMode="StrongWildcard" listenBacklog="10"
        maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
        maxReceivedMessageSize="40000000">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
       <security mode="Message">
        <message clientCredentialType="Windows" />
      </security>
    </binding>
于 2012-10-30T13:20:05.490 に答える