У меня есть приложение с сервером «Домен приложений», которое принимает вызовы от отдельных доменов приложений (в которых размещаются плагины, разработанные другими людьми и не заслуживающие доверия).
С сервера AppDomain мне нужно знать, какой «Плагин» (AppDomain) фактически выполняет вызов, чтобы я мог убедиться, что у этого плагина есть доступ к ресурсу.
Я мог бы просто передать учетные данные для вызова метода удаленного взаимодействия, но я обеспокоен тем, что при этом хитрый программист из «Плагина А» может изменить код так, чтобы он, казалось, исходил из «Плагина В».
Я изучил создание своей собственной реализации "ObjRef" в приложении "Сервер", полагая, что "ChannelInfo.ChannelData" может содержать информацию о клиентском плагине, выполняющем вызов, и реализовал следующий код:
public int DomainId
{
get
{
int domainId = -1;
// The type "System.Runtime.Remoting.Channels.CrossAppDomainData" is not Public,
// so we have to use reflection to get access to it.
for (int i = 0; i < ChannelInfo.ChannelData.Length; i++)
{
object o = ChannelInfo.ChannelData[i];
if (o.ToString() == "System.Runtime.Remoting.Channels.CrossAppDomainData")
{
System.Reflection.BindingFlags flags =
System.Reflection.BindingFlags.GetProperty
| System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.NonPublic;
domainId = (int)o.GetType().GetProperty("DomainID", flags).GetValue(o, null);
}
}
return domainId;
}
}
Но полученный с помощью DomainId такой же, как и у сервера AppDomain.CurrentDomain.Id, когда мне действительно нужен идентификатор клиентского (вызывающего) AppDomain
Такое ощущение, что это слишком сложно: -)
Есть идеи?