2013-09-30 3 views
7

Я отрываю свои волосы от этого, у меня есть служба WCF, которую я могу вызвать через браузер, и она отлично работает, когда я вызываю ее из веб-приложения с помощью ниже метод я получаю (401) Несанкционированный Ошибка. И сервис не вызван. Более того, когда я запускаю свое веб-приложение с моего локального компьютера (режим отладки с помощью IIS Express), указанный на моем dev-сервере (IIS7), он работает, но когда я развертываю свое веб-приложение на сервере dev и указываю его на службы dev-сервера, с ошибкой 401. Я думаю, что это как-то связано с IIS7, но я не уверен на 100%, и помощь будет очень полезна.Не передавать учетные данные в службу WCF, приводя к 401

Я искал онлайн ответы, но пока что лучшее, что я нашел, это this.

Мой вызов службы выглядит следующим образом:

var request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "GET"; 
request.ContentType = "application/json; charset=utf-8"; 
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested; 
request.Credentials = CredentialCache.DefaultCredentials; 

WebResponse responce = request.GetResponse(); 
Stream reader = responce.GetResponseStream(); 

var sReader = new StreamReader(reader); 
string outResult = sReader.ReadToEnd(); 
sReader.Close(); 

var result = (T) JsonConvert.DeserializeObject(outResult, typeof (T)); 
return result; 

Моя конфигурация для службы выглядит следующим образом:

<service name="RGMPServices.Householding.Services.AccountService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IAccountService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.HouseholdService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IHouseholdService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.UserService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IUserService" /> 
    </service> 
</services> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webBehaviour"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint name="SecuredHttpEndpointBinding" helpEnabled="true" automaticFormatSelectionEnabled="true"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </standardEndpoint> 
    </webHttpEndpoint> 
</standardEndpoints> 

Я поставил некоторые протоколирование на вызов обслуживания клиентов, как раз перед Я зволю в службу, ответ:

DEBUG 2013-10-01 13:15:13,569 452ms ServiceGetSingle - Passing Login: MYLANDOMAIN\MYLANUSERNAME

ERROR 2013-10-01 13:15:13,631 514ms ServiceGetSingle - ERROR Calling ServiceGetSingle with user credentials login: MYLANDOMAIN\MYLANUSERNAME System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.HttpWebRequest.GetResponse() at Householding.Common.ServiceHelper.ServiceGetSingle[T](String url)

код выглядит следующим образом:

logger.Debug("Passing Login: " 
    + System.Security.Principal.WindowsIdentity.GetCurrent().Name) 

Даже когда я установил AppPool для моего сайта на мою учетную запись домена она до сих пор не разрешать мне получить доступ к службе WCF, но опять-таки: он работает в браузере , Так странно!

+0

Не всегда легко работать с аутентификацией WCF и Windows. Попробуйте Fiddler на клиенте отслеживать поток HTTP. Также попробуйте настроить трассировку WCF на сервере: http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe

ответ

1

Возможно, вы являетесь жертвой проблемы с двойным прыжком при использовании Integrated Windows Authentication (IWA) и Kerberos. Первый переход из вашего браузера в веб-приложение; второй прыжок из вашего веб-приложения в службу WCF.

Вот некоторые ресурсы, которые более полно объяснить проблему, и может предложить решение:

Вы можете настроить Active Directory для поддержки Kerberos delegation (обычно инфраструктурным парням это не нравится), или вы можете отключить олицетворение и нас e «служебная» учетная запись для веб-приложения и пула приложений IIS, который может аутентифицироваться с помощью службы WCF от имени конечного пользователя.

1

Каковы учетные данные по умолчанию на сервере Dev? Попробуйте сделать журнал прямо там и посмотреть, что вы получаете.

Это то, что я подозреваю: Запуск локально, учетные данные - это ВАШИ окна. Когда вы вызываете dev-сервер из dev, учетные данные будут представлять собой учетную запись, на которой работает веб-сайт. Если у этой конкретной учетной записи нет доступа, она взорвется.

+0

ОБНОВЛЕННЫЙ ВОПРОС – Joshy

+0

Это журнал с момента запуска приложения с сервера dev? –

+0

Да, это от сервера dev – Joshy

1

Как они говорили раньше, это похоже на проблему олицетворения. Вы пытались запустить клиентскую программу с «run as», чтобы изменить учетные данные?

Кроме того, вы можете изменить эту строку кода

request.Credentials = CredentialCache.DefaultCredentials; 

в

request.Credentials = new NetworkCredential("MyUsername", "MyPassword"); 

И посмотреть, если он работает. Также вам нужно создать учетную запись «MyUserName» с «MyPassword» на веб-сервере, чтобы она работала.

1

Эти ошибки могут быть вызваны, когда аутентифицированный пользователь не имеет доступа к физическому пути, на котором размещается служба WCF. На сервере dev откройте диспетчер IIS и перейдите к виртуальному каталогу службы. Справа на панели «Действия» нажмите «Основные настройки». Под текстовым полем «Физический путь» нажмите «Подключить как ...». Выберите «Особый пользователь» и попробуйте настроить его на учетную запись пользователя, которая, как вы знаете, имеет права на физическую папку на dev-сервере. Как правило, это будет учетная запись службы, пароль которой не истекает.

1

При запуске из браузера браузер отправляет ваши учетные данные. Кроме того, iis express будет работать как зарегистрированный пользователь, поэтому он также отправляет ваши учетные данные. Iis отличается, он будет работать как локальная учетная запись. Даже если у вас есть аутентификация на вашем лицевом интерфейсе iis, это не будет передано на сервер. Листы подделки Windows ограничены количеством разрешенных хопов, обычно 0. Это делается для того, чтобы точно не делать то, что вы делаете. Если вы хотите, чтобы аутентификация на лицевой стороне протекала на бэкэнд, вы должны, вероятно, сделать аутентификацию самостоятельно и захватить пользователя/пройти по пути. В качестве альтернативы, если вы сами выполняете аутентификацию, вы можете создать маркер олицетворения, который позволяет переходить на другой компьютер, и он должен работать.

Смежные вопросы