【问题标题】:Is there something like a OnClientConnected event for .NET remoting?.NET 远程处理是否有类似 OnClientConnected 事件?
【发布时间】:2009-09-11 06:10:10
【问题描述】:

我在我的服务器上使用这样的东西:

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

我想订阅某种事件,以便当远程客户端连接到 myRemoteObject 时,我可以检查 Thread.CurrentPrincipal.Identity.Name 来决定是否授权他。

目前我正在对 myRemoteObject 的每个暴露的远程方法进行授权检查,这很混乱......

【问题讨论】:

  • 您好,您是否知道 .NET Remoting 已被弃用以支持 WCF?
  • 嗨!是的,我听说过,但我公司的环境仍然卡在 .NET 2.0 中 :(

标签: c# .net remoting .net-remoting


【解决方案1】:

在我的远程应用程序中,我定义了一个特殊的对象/接口,客户端首先需要授权。如果客户端成功授权远程对象,则特殊对象返回。所以你在一个地方获得了授权。

看起来像这样。

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");

【讨论】:

  • 这很简洁,但不允许不同方法的不同授权。 (这对于这个问题的用例可能没问题。)
  • 这是对的。但是您可以为每个用户返回不同的远程对象。每个远程对象都可以拥有自己的权限。
  • 谢谢,这将适合我的情况,因为我不需要按方法授权。
【解决方案2】:

您可以使用PostSharp 之类的东西从每个方法中提取检查 - 只需在 AOP 建议中执行即可。 (您将其应用于公开其方法的类,而不是客户端连接。)

这种方法独立于您用于远程处理的任何传输方式 - 它只是考虑到跨远程类中所有方法的授权问题。

【讨论】:

  • 谢谢,这很有趣我也想知道是否有一种方法可以使用自定义属性来执行一些前/后方法逻辑。
  • PostSharp 使用自定义属性 - 观看视频:postsharp.org/about/video
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多