Есть ли что-то вроде события OnClientConnected для удаленного взаимодействия .NET?
-
05-07-2019 - |
Вопрос
Я использую что-то вроде этого на моем сервере:
TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
RemotingServices.Marshal(myRemoteObject, "myRemoteObject");
Я хотел бы подписаться на какое-то событие, чтобы всякий раз, когда удаленный клиент подключался к myRemoteObject, я мог проверить Thread.CurrentPrincipal.Identity.Name, чтобы решить, следует ли ему авторизовать.
В настоящее время я делаю проверку авторизации в каждом открытом удаленном методе myRemoteObject, который является грязным ...
Решение
В своем приложении удаленного взаимодействия я определил специальный объект / интерфейс, для которого клиенты сначала должны авторизоваться. Специальный объект затем возвращается, если клиент успешно авторизовал удаленный объект. Таким образом, у вас есть разрешение в одном месте.
Это выглядит примерно так.
public interface IPortal
{
object SignIn(string name, string password);
}
public class Portal : MarshalByRefObject, IPortal
{
private object _remoteObject;
public Portal() {
_remoteObject = new RemoteObject();
}
public object SignIn(string name, string password)
{
// Authorization
// return your remote object
return _remoteObject;
}
}
В вашем приложении вы размещаете Portal-Object
TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
Portal portal = new Portal()
RemotingServices.Marshal(portal , "portal");
Другие советы
Вы можете использовать что-то вроде PostSharp , чтобы отделить проверку от каждого метода - просто сделайте это в Совет АОП. (Вы применяете это к классу, который предоставляет свои методы, а не к клиентскому соединению.)
Этот подход не зависит от того, какой транспорт вы используете для удаленного взаимодействия, - он просто устраняет сквозную проблему авторизации для всех методов вашего удаленного класса.