Почему IpcChannel говорит мне: «Не удается открыть маркер безопасности анонимного уровня?» - PullRequest
5 голосов
/ 12 мая 2009

У меня есть довольно простое клиент-серверное приложение, которое я использую для разделения двух компонентов, которые не могут жить вместе в одном процессе. При их разработке (сервер exe, клиент - библиотека), все мои юнит-тесты счастливы, как свиньи в навозе. Когда я перехожу к повторному использованию библиотеки в другом месте, я получаю следующее исключение:

System.Runtime.Remoting.RemotingException: An error occurred while processing the request on the server: System.Security.SecurityException: Cannot open an anonymous level security token.

   at System.Security.Principal.WindowsIdentity.GetCurrentInternal(TokenAccessLevels desiredAccess, Boolean threadOnly)
   at System.Security.Principal.WindowsIdentity.GetCurrent()
   at System.Runtime.Remoting.Channels.Ipc.IpcServerTransportSink.ServiceRequest(Object state)
The Zone of the assembly that failed was:
MyComputer.

На данном этапе я настроил удаленное взаимодействие с обеих сторон в коде, а не в конфигурационные файлы. Они фактически идентичны:

BinaryClientFormatterSinkProvider client = new BinaryClientFormatterSinkProvider();
BinaryServerFormatterSinkProvider server = new BinaryServerFormatterSinkProvider();
server.TypeFilterLevel = TypeFilterLevel.Full;

Hashtable config = new Hashtable();
config["name"] = "SomeName";
config["portName"] = "SomePortName";

config["typeFilterLevel"] = "Full";
config["impersonate"] = "true";
config["tokenImpersonationLevel"] = "Impersonation";
config["useDefaultCredentials"] = "True";
config["secure"] = "True";

Channel = new IpcChannel(config, client, server);

Таким образом, вопрос заключается в следующем: почему инфраструктура удаленного взаимодействия хочет создавать анонимный токен, когда олицетворение включено? У меня совершенно не хватает мест, чтобы искать ответы на этот вопрос.

1 Ответ

0 голосов
/ 20 августа 2015

ЭТО НЕ ОТВЕТ

Я знаю, что это старый вопрос, но, возможно, кто-то нашел решение. У меня есть настройки, аналогичные настройкам автора, но требуется только уровень идентификации:

Серверная сторона:

Dictionary<string, object> properties = new Dictionary<string, object>();
properties["authorizedGroup"] = GetUsersGroupName();
properties["name"] = configuration.ServiceShortName + ".Server";
properties["portName"] = configuration.ServiceGuid;
BinaryServerFormatterSinkProvider sinkProvider = new BinaryServerFormatterSinkProvider();
sinkProvider.TypeFilterLevel = TypeFilterLevel.Full;
Channel = new IpcServerChannel(properties, sinkProvider);
Channel.IsSecured = true;
ChannelServices.RegisterChannel(Channel, true);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(AppManagerServer), configuration.ServerObjectUrl, WellKnownObjectMode.SingleCall);

string GetUsersGroupName()
{
        const string builtInUsersGroup = "S-1-5-32-545";
SecurityIdentifier sid = new SecurityIdentifier(builtInUsersGroup);
NTAccount ntAccount = (NTAccount)sid.Translate(typeof(NTAccount));
        return ntAccount.Value;
}

Клиентская сторона:

channel = new IpcClientChannel(AppManagerConfiguration.Instance.ServiceShortName + ".Client", null);
ChannelServices.RegisterChannel(channel, true);
string appManagerUrl = "ipc://" + AppManagerConfiguration.Instance.ServiceGuid + "/" + AppManagerConfiguration.Instance.ServerObjectUrl;
(IAppManager)Activator.GetObject(typeof(IAppManager), appManagerUrl).DoSomething();

И тогда я периодически получаю следующее: Произошла ошибка при обработке запроса на сервере: System.Security.SecurityException: не удалось открыть маркер безопасности анонимного уровня.

в System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels requiredAccess, Boolean threadOnly)

в System.Security.Principal.WindowsIdentity.GetCurrent ()

в System.Runtime.Remoting.Channels.Ipc.IpcServerTransportSink.ServiceRequest (состояние объекта)

Зона сборки, которая провалилась, была: MyComputer

...