Pregunta

Estoy usando algo como esto en mi servidor:

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

Me gustaría suscribirme a algún tipo de evento para que cada vez que un cliente remoto se conecte a myRemoteObject, pueda revisar Thread.CurrentPrincipal.Identity.Name para decidir si lo autorizo.

Actualmente estoy haciendo la verificación de autorización en todos los métodos remotos expuestos de myRemoteObject, que es un desorden ...

¿Fue útil?

Solución

En mi aplicación remota, definí un objeto / interfaz especial donde los clientes primero deben autorizar. El objeto especial se devuelve, si el cliente autorizó con éxito el objeto remoto. Así que tienes la autorización en un solo lugar.

Se ve algo como esto.

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

En tu aplicación alojas el Portal-Objeto

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

Otros consejos

Puede usar algo como PostSharp para eliminar el cheque de cada método, solo hágalo en el AOP consejos. (Esto se aplica a la clase que expone sus métodos, no a la conexión del cliente).

Este enfoque es independiente del transporte que utilice para la comunicación remota, simplemente se limita a la preocupación transversal de la autorización en todos los métodos de su clase remota.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top