У меня есть служба WCF, которая размещена в службе Windows.Служба Windows установлена и работает под учетной записью локальной системы.
Моя цель - выдать себя за вызывающего, проверить, достаточно ли у него разрешений, если он затем разрешил ему продолжить, в противном случае я выдам исключение ошибки.
БД и служба Windows живут на одной машине.Мы используем проверку подлинности Windows.
Файл app.config службы Windows:
<service name="ShoppingService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:9900/ShoppingService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding"
contract="solution.IShoppingService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="ShoppingServicemex" binding="basicHttpBinding"
contract="IMetadataExchange" />
</service>
Поведение:
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization impersonateCallerForAllOperations="true"/>
</behavior>
Реализация WCF:
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public List<Job> GetItems()
{
using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
string name = System.Threading.Thread.CurrentPrincipal.Identity.Name;
return ItemDao.GetItems();
}
}
Клиент подключается к услуге и отправляет запрос.Когда я отлаживаю службу Windows WCF, значение ServiceSecurityContext.Current.WindowsIdentity ** является вызывающей стороной службы.Это нормально.
Затем я выдаю себя за ServiceSecurityContext.Current.WindowsIdentity.Impersonate()
.
Проблема в том, что когда я вызываю DAO ItemDao.GetItems();
, который обращается к БД со следующим соединением: Server=MyServer;Trusted_Connection=yes;Database=My_dev_db;
Я получаю сообщение об ошибке:
System.ServiceModel.FaultException`1 was unhandled by user code
Message=Could not get ADO.NET connection.
Source=mscorlib
Login failed for user: domain\machinename$
Кажется, что он вызывает БД с учетной записью пользователя LocalSystem.Я хочу выдавать себя за абонента каждый раз, поэтому проверяю, достаточно ли у него разрешений безопасности для вызова DAO.
Я создаю клиента с использованием фабрики каналов функции WCF spring.net.
Чтоя скучаю?Пожалуйста, руководство?