Различают локальную учетную запись службы и олицетворенную идентификацию клиента в 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...
Другие вопросы по тегам