Pergunta

Eu estou usando algo parecido com isso no meu servidor:

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

Gostaria de assinar algum tipo de evento para que sempre que um cliente remoto se conecta a myRemoteObject, posso verificar o Thread.CurrentPrincipal.Identity.Name para decidir se a autorizá-lo.

Atualmente eu estou fazendo a verificação de autorização em cada método remoto exposta do myRemoteObject que é uma bagunça ...

Foi útil?

Solução

Na minha aplicação remoting i definido um objeto / interface especial onde os clientes primeiro precisa autorizar. O objeto especial, em seguida, retorna, se o cliente autorizado com êxito o objeto remoto. Então você tem a autorização em um só lugar.

Parece algo como isto.

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

Em seu aplicativo você hospedar o Portal-objeto

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

Outras dicas

Você pode usar algo como PostSharp para fator a verificação de cada método - basta fazê-lo na aconselhamento AOP. (Você aplicar isso para a classe que está expondo seus métodos, não para a conexão do cliente.)

Esta abordagem é independente de qualquer transporte que você usa para comunicação remota -. Apenas fatores fora a preocupação transversal de autorização em todos os métodos em sua classe remoted

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top