Remoting系列专题---构建Remoting“防火墙”
2008-04-17 13:50
295 查看
做项目不得不考虑安全问题,但是在Remoting应用中我似乎没有找到象WebService那样现成可用的防止非授权人员随意调用的方法和验证安全机制。当然,简单一点的可以通过Remoting客户端传输一些验证代码,然后在服务端验证这些代码的合法性,以实现是否安全授权调用,但是总觉得这样比较麻烦。我也见有些人主动把客户端的IP地址获取后主动送入到Remotin g服务端验证以便识别是否合法,其实原理跟上面的是一样的道理,我觉得这样传送很容易让别人仿造一些数据送入,从而轻易获得合法调用。当然以上数据可以通过把数据特殊的加密和解密也能得到比较好的安全性。在这里我是想介绍另外一种安全机制,即构建Remoting“防火墙”。
其实我所说的Remoting“防火墙”也是最基本的。由于Remoting的TcpChannel没有提供内建的认证机制,所以没有现成获取客户端的方法,我们可以在Remoting Server端注册上自定义的Server Channel Sink,通过Transport Headers来获取request的IP,以下是自定义的Server Channel Sink类的代码,(注:原代码不是我写的,原出处我忘记了,所以无法标注来源)
using System;
2using System.Collections;
3using System.IO;
4using System.Runtime.Remoting;
5using System.Runtime.Remoting.Messaging;
6using System.Runtime.Remoting.Channels;
7using System.Threading;
8using System.Net;
9
10
11namespace Colorful.RemoteObject
12
以下是远程对象主程序代码
class Program
2 {
3 验证客服端的合法性#region 验证客服端的合法性
/**//// <summary>
/// 检查Remoting客户端的合法性
/// </summary>
/// <returns></returns>
public bool CheckRemotingClient()
{
IPAddress data = (IPAddress)CallContext.GetData("ClientIPAddress");
if (clientIPAddress.ContainsKey(data))
{
string msg = "接受远程地址:" + data.ToString() + "的服务请求";
Console.WriteLine(msg);
return true;
}
else
{
string msg = "远程地址:" + data.ToString() +"不在许可范围内,服务请求被拒绝";
Console.WriteLine(msg);
SQL2005DAL.CommDAL.WriteLogFile("RemotingClientTrace", msg, "Warring", false);
return false;
}
}
#endregion
其实我所说的Remoting“防火墙”也是最基本的。由于Remoting的TcpChannel没有提供内建的认证机制,所以没有现成获取客户端的方法,我们可以在Remoting Server端注册上自定义的Server Channel Sink,通过Transport Headers来获取request的IP,以下是自定义的Server Channel Sink类的代码,(注:原代码不是我写的,原出处我忘记了,所以无法标注来源)
using System;
2using System.Collections;
3using System.IO;
4using System.Runtime.Remoting;
5using System.Runtime.Remoting.Messaging;
6using System.Runtime.Remoting.Channels;
7using System.Threading;
8using System.Net;
9
10
11namespace Colorful.RemoteObject
12
以下是远程对象主程序代码
class Program
2 {
3 验证客服端的合法性#region 验证客服端的合法性
/**//// <summary>
/// 检查Remoting客户端的合法性
/// </summary>
/// <returns></returns>
public bool CheckRemotingClient()
{
IPAddress data = (IPAddress)CallContext.GetData("ClientIPAddress");
if (clientIPAddress.ContainsKey(data))
{
string msg = "接受远程地址:" + data.ToString() + "的服务请求";
Console.WriteLine(msg);
return true;
}
else
{
string msg = "远程地址:" + data.ToString() +"不在许可范围内,服务请求被拒绝";
Console.WriteLine(msg);
SQL2005DAL.CommDAL.WriteLogFile("RemotingClientTrace", msg, "Warring", false);
return false;
}
}
#endregion
相关文章推荐
- Remoting系列专题---构建Remoting“防火墙”
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- Microsoft .Net Remoting系列专题
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务 (转载)
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- 【转】Microsoft .Net Remoting系列专题之一
- Microsoft .Net Remoting系列专题之三
- Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- .NET Remoting专题系列1
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之一[转:含评论]
- Microsoft .Net Remoting系列专题之一