Domanda

Sto usando qualcosa del genere sul mio server:

TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
RemotingServices.Marshal(myRemoteObject, "myRemoteObject");

Vorrei iscrivermi a un tipo di evento in modo che ogni volta che un client remoto si connette a myRemoteObject, posso controllare Thread.CurrentPrincipal.Identity.Name per decidere se autorizzarlo.

Attualmente sto eseguendo il controllo di autorizzazione in ogni metodo remoto esposto di myRemoteObject che è un casino ...

È stato utile?

Soluzione

Nella mia applicazione remota ho definito un oggetto / interfaccia speciale in cui i client devono prima autorizzare. Quindi restituisce l'oggetto speciale, se il client ha autorizzato correttamente l'oggetto remoto. Quindi hai l'autorizzazione in un unico posto.

Sembra qualcosa del genere.

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;
  }
}

Nella tua applicazione ospiti Portal-Object

TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
Portal portal = new Portal()
RemotingServices.Marshal(portal , "portal");

Altri suggerimenti

Potresti usare qualcosa come PostSharp per fattorizzare il controllo da ogni metodo - basta farlo nel Consiglio AOP. (Lo applichi alla classe che sta esponendo i suoi metodi, non alla connessione client.)

Questo approccio è indipendente dal trasporto che utilizzi per il remoting - elimina semplicemente la preoccupazione trasversale dell'autorizzazione in tutti i metodi della tua classe remotata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top