Я разрабатываю режим «автоподключения» между приложением WPF и сервисом Windows WCF.
Я хочу разрешить только доверенным пользователям домена подключаться к определенной службе WCF без необходимости использования учетных данных Windows (пользователь уже вошел в свой сеанс Windows).
Эта служба затем зарегистрирует пользователя в приложении.
Я создал службу WCF с режимом безопасности для «Transport» и Transport.ClientCredentialType для «Windows» (одинаковая привязка как на клиенте, так и на сервере).
В том же приложении выполняются другие службы WCF с режимом безопасности «Нет».
Когда я запускаю службу Windows на компьютере домена под учетной записью LocalService и запускаю клиент на другом компьютере под учетной записью пользователя домена, я могу получить идентификатор пользователя Windows «ДОМЕН \ пользователь» на стороне сервера в объекте OperationContext ,
Я вижу, что используется Kerberos, и я думаю, что есть какое-то подражание, которое в порядке.
Но когда я запускаю службу Windows на компьютере рабочей группы (вне домена), где пользователь домена не известен, для идентификатора OperationContext Windows устанавливается значение «MACHINE_NAME \ Administrator» (локальный сеанс, созданный на сервере).
В сервисном звонке нет ошибок, нет исключений, и я не могу понять, почему.
Свойство IsAuthenticated объекта WindowsIdentity всегда имеет значение true.
Я уже проверял в режиме безопасности «Сообщение».
Я хотел знать, есть ли возможность сказать WCF отклонить ВСЕ соединения, которые не являются подлинно аутентифицированными?
UPDATE :
Вот некоторые сведения, которые могут помочь:
- Клиентское приложение - это приложение WPF
- Сервер - это классическая служба Windows, работающая в режиме LOCAL SERVICE
- Привязки net.tcp
- Классы прокси-клиентов создаются с помощью svcutil.exe
- Все делается кодом, без конфигурационного файла
- Вот код, создающий ServiceClient:
public static TClient Create<TClient, TChannel>(params IContractBehavior[] behaviors)
where TChannel : class
where TClient : ClientBase<TChannel>
{
var typeOfClient = typeof(TClient);
var ctor = typeOfClient.GetConstructor(new[] { _bindingType, _endpointAddressType });
if (ctor == null)
{
throw new Exception($"{typeOfClient} has no constructor taking 2 parameters ({_bindingType},{_endpointAddressType})");
}
var address = getClientBaseEndPointAddress(typeof(TChannel));
var binding = getBinding<TClient>(address.Uri.Scheme);
var clt = (TClient)ctor.Invoke(new object[] { binding, address });
foreach (var behavior in behaviors)
{
clt.ChannelFactory.Endpoint.Contract.Behaviors.Add(behavior);
}
manageDataContractResolver<TClient, TChannel>(clt);
clt.setOperationTimeout(binding.SendTimeout);
return clt;
}
- Метод getBinding используется приложением «Клиент и сервер»:
var ret = new NetTcpBinding
{
MaxBufferSize = bc.MessageSize,
MaxBufferPoolSize = bc.MessageSize,
...
};
// Secured or not
if (secured)
{
ret.Name = "Default_Secured_Binding";
ret.Security.Mode = SecurityMode.Transport;
ret.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
}
else
{
ret.Security.Mode = SecurityMode.None;
ret.Name = "Default_Binding";
}
Я думал, что WCF отклонит любой запрос, который не был полностью аутентифицирован, но я не могу получить "ошибку аутентификации".
Дайте мне знать, если вам нужна дополнительная информация.