WCF netTcpBinding, размещенный в IIS с аутентификацией windows, выдает сообщение «Служба не позволяет вам входить в систему анонимно» - PullRequest
0 голосов
/ 16 июня 2020

У меня есть служба WCF с netTCPBinding, размещенная на сервере A в IIS с безопасностью по умолчанию (режим = Транспорт). Таким образом, очевидно, что он использует аутентификацию Windows. Эта служба WCF используется через веб-приложение ASP. Net, размещенное на сервере «B» в IIS, и все работает нормально, пока я не включу аутентификацию Windows для веб-приложения. Когда включена аутентификация Windows, я получаю следующую ошибку. Анонимная аутентификация была отключена, и только Windows аутентификация включена в IIS

System.IdentityModel.Tokens.SecurityTokenValidationException: The service does not allow you to log on anonymously.
   at System.ServiceModel.Security.SecurityUtils.ValidateAnonymityConstraint(WindowsIdentity identity, Boolean allowUnauthenticatedCallers)
   at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeAcceptor.CreateClientSecurity(NegotiateStream negotiateStream, Boolean extractGroupsForWindowsAccounts)
   at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeAcceptor.OnAcceptUpgrade(Stream stream, SecurityMessageProperty& remoteSecurity)
   at System.ServiceModel.Channels.StreamSecurityUpgradeAcceptorBase.AcceptUpgrade(Stream stream)
   at System.ServiceModel.Channels.InitialServerConnectionReader.UpgradeConnection(IConnection connection, StreamUpgradeAcceptor upgradeAcceptor, TimeSpan openTimeout, IDefaultCommunicationTimeouts defaultTimeouts)
   at System.ServiceModel.Channels.ServerSessionPreambleConnectionReader.ServerFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelHandler.OpenAndEnsurePump()

Теперь, когда и служба WCF, и веб-приложение находятся на одном сервере, все работает нормально. Проблема возникает только тогда, когда появляются разные серверы и все, кроме Windows Authentication также работает нормально. К вашему сведению, серверы находятся в доверенном домене.

Ниже представлена ​​конфигурация службы WCF

<system.serviceModel>
        <behaviors>
            <endpointBehaviors>
                <behavior name="BehaviorA">
                    <clientCredentials>
                        <windows />
                    </clientCredentials>
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="Service1Behavior">
                    <dataContractSerializer maxItemsInObjectGraph="2147438647" />
                    <serviceCredentials>
                        <windowsAuthentication />
                    </serviceCredentials>
                    <serviceDebug includeExceptionDetailInFaults="true" />
                    <serviceMetadata httpGetEnabled="false" />
                    <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <mexTcpBinding>
                <binding name="MaxiMexBinding" />
            </mexTcpBinding>
            <netTcpBinding>
                <binding closeTimeout="00:01:00" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="100" maxReceivedMessageSize="2147483647" name="PortSharingBinding" openTimeout="00:01:00" portSharingEnabled="true" receiveTimeout="10675199.02:48:05.4775807" sendTimeout="00:01:00" transactionFlow="false" transactionProtocol="OleTransactions" transferMode="Buffered">
                    <readerQuotas maxArrayLength="2147438647" maxBytesPerRead="2147438647" maxDepth="2147438647" maxNameTableCharCount="2147438647" maxStringContentLength="2147438647" />
                    <reliableSession enabled="false" inactivityTimeout="00:10:00" ordered="true" />
                    <security mode="Transport">
                        <transport protectionLevel="EncryptAndSign"/>
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <diagnostics>
            <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" maxSizeOfMessageToLog="2147483647" />
        </diagnostics>
        <services>
            <service behaviorConfiguration="Service1Behavior" name="Test">
                <endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="MyContract" name="Ep1">
                </endpoint>
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://mydomain.com:808/MyWcf.svc" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>

Конфигурация клиента использует то же, что и выше, и поэтому никаких серьезных проблем с этим нет.

Было бы здорово, если бы кто-нибудь мог мне с этим помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...