Служба WCF не олицетворяет клиента - PullRequest
2 голосов
/ 07 декабря 2010

Логистика: 1 сервер, на котором работает служба WCF. 1 сервер, на котором работает база данных для службы WCF.

Вопрос: У меня есть служба WCF, работающая на 1 сервере, который подключается к отдельному серверу для получения необходимых данных, которые ему необходимо получить. Моя проблема заключается в том, что при вызове службы с клиентского компьютера, я получаю ошибку sql базы данных, утверждающую, что «Ошибка входа для пользователя» NT AUTHORITY \ ANONYMOUS LOGON. Я полагаю, что настроил службу WCF для использования олицетворения.

Конфигурация сервера WCF:

<bindings>
  <ws2007HttpBinding>
    <binding maxReceivedMessageSize="214748">
      <security mode="Message">
        <transport clientCredentialType="Windows"
                   proxyCredentialType="Windows" realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                 algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
  </ws2007HttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="Host.ServiceBehavior" name="Wcf.MyWebService">
    <endpoint address="" behaviorConfiguration=""
              binding="ws2007HttpBinding" contract="Wcf.MyWebServiceSoap">
      <identity>
        <servicePrincipalName value="ServerMachineName" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Host.ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization impersonateCallerForAllOperations="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Код услуги WCF:

public class MySebService: MyWebServiceSoap
{
   [OperationBehavior(Impersonation = ImpersonationOption.Required)]
   public string TestWebMethod()
   {
     DbDal dal = CreateDataAccessLayer();

     return dal.GetStringFromDatabase();
   }
}

Конфигурация клиента и код:

Я программно настраиваю следующие элементы конфигурации:

public void TestWebMethod()
{
  WS2007HttpBinding binding = new WS2007HttpBinding();
  EndpointAddress endpoint = new EndpointAddress("uri");
  ServiceClient client = new ServiceClient(binding, endpoint);
  client.ClientCredentials.Windows.AllowedImpersonationLevel =
                               TokenImpersonationLevel.Impersonation;
  client.ClientCredentials.Windows.AllowNtlm = true;
  string result = client.TestWebMethod();
  client.Close();
}

1 Ответ

1 голос
/ 07 декабря 2010

TokenImpersonationLevel.Impersonation разрешает службе доступ к ресурсам, локальным для службы, но не позволяет службе обращаться к внешним ресурсам (например, другой службе).

Вы должны установить допустимый уровень олицетворения на TokenImpersonationLevel.Delegation .

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
...