Есть ли что-то вроде события OnClientConnected для удаленного взаимодействия .NET?

StackOverflow https://stackoverflow.com/questions/1409239

Вопрос

Я использую что-то вроде этого на моем сервере:

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 , чтобы отделить проверку от каждого метода - просто сделайте это в Совет АОП. (Вы применяете это к классу, который предоставляет свои методы, а не к клиентскому соединению.)

Этот подход не зависит от того, какой транспорт вы используете для удаленного взаимодействия, - он просто устраняет сквозную проблему авторизации для всех методов вашего удаленного класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top