Различают локальную учетную запись службы и олицетворенную идентификацию клиента в WCF ServiceLayer
У нас есть веб-интерфейс, написанный на MVC, который использует SSO и проверку подлинности Windows, и этот интерфейс подключается к уровню службы Backend WCF, настроенному для работы с определенной учетной записью службы AD.
Нам нравится этот подход, потому что соединения с сервером базы данных являются доверенными, и у нас нет паролей в web.config, и сервисному слою WCF разрешено подключаться к SQL Server, поскольку учетная запись службы имеет надлежащие права на сервере БД, однопользовательские пользователи не и они не должны.
то, что я сейчас ищу, - это способ сделать службу WCF способной различать, какая идентификационная информация пользователя соединяется с клиентом, и проверять правила безопасности на уровне приложений (мы используем платформу безопасности Visual Guard), но в то же время у нас все еще есть необходимо использовать текущую учетную запись службы, когда мы используем EF для подключения к SQL.
то, что я сделал до сих пор, заключается в следующем,
когда я создаю клиент WCF в веб-интерфейсе:
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
{
var client = new RPPServiceInterface().GetRWSService();
...
}
с того момента, как я ввел этот призыв к Impersonate
выше, в приведенном ниже коде я могу получить пользователя клиента, а не учетную запись службы:
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public List<RWSProgram> GetCedentsPrograms(int cedentID, int uwYear)
{
var currentSec = ServiceSecurityContext.Current;
...
}
то, что я хотел бы сделать, - это использовать обе идентификационные данные клиента для проверки безопасности, а затем каким-то образом освободить эту идентификационную информацию или иметь другой способ выдать себя за служебную учетную запись на служебном уровне, чтобы открыть мое соединение SQL... Есть идеи? Я делаю что-то неправильно или неправильно понимаю всю картину?
PS Я уже проверил этот, но не помогло.... Служба WCF двойное олицетворение?
Спасибо, Дэвид.
1 ответ
Это то, что вы ищите?:
// ...Service operation code impersonating a client here
using (WindowsImpersonationContext processContext = WindowsIdentity.Impersonate(IntPtr.Zero))
{
// Database access stuff here
// Within the using block the client is no longer impersonated:
// context reverts to the identity running the service host process
// (I'm assuming this is what you call your service account)
}
// Ensuing code impersonates the client as previously...