remoting中怎么对客户端进行身份验证?

oldhunter 2006-05-13 07:41:18
remoting中怎么对客户端进行身份验证? 网上竟然找不到一篇详细的文章,都是一笔概过.
用TcpChannel通道,我的理解是:
让用户提交用户名和密码,如果正确,把用户信息绑定到当前线程:Thread.CurrentPrincipal.然后在每个远程对象的方法或属性开头都进行验证该用户是不是合法的(通过数据库或文件保存合法用户信息). 是不是这样?
那用CallContext绑定用户信息也可以吧?
标准做法是怎么样的?
...全文
708 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengfangfang 2006-06-14
  • 打赏
  • 举报
回复
MSDN 2003中有两篇文章
.NET Remoting Security Solution, Part 1:
.NET Remoting Security Solution, Part 2:

fengfangfang 2006-06-14
  • 打赏
  • 举报
回复
.NET 远程处理在默认情况下不进行身份验证或加密。因此,建议您在与客户端或服务器进行远程交互之前,采取任何必要的措施确认它们的身份。因为 .NET 远程处理应用程序需要 FullTrust 权限才能执行,所以未经授权的客户端如果被授予了访问您的服务器的权限,该客户端就可能像完全受信任的客户端一样执行代码。应始终验证终结点的身份并将通信流加密,通过在 Internet 信息服务 (IIS) 中承载远程类型,或者通过生成自定义通道接收对来完成这项工作。
DragonCity1 2006-06-14
  • 打赏
  • 举报
回复
Mark
liuqian0415 2006-06-11
  • 打赏
  • 举报
回复
up
levinknight 2006-06-09
  • 打赏
  • 举报
回复
不要在每个方法里都加验证
yanzimywife_2005 2006-06-08
  • 打赏
  • 举报
回复
mark!
SaSBYa 2006-06-08
  • 打赏
  • 举报
回复
自定义sink不是一种好的方法,似乎在下一代系统中,这些东西都会被取代.
qiushikong 2006-06-08
  • 打赏
  • 举报
回复
自定义sink
oldhunter 2006-06-07
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4807/4807760.xml?temp=.8147241
xxqq0824 2006-05-29
  • 打赏
  • 举报
回复
mark
oldhunter 2006-05-27
  • 打赏
  • 举报
回复
up
antoniusguo 2006-05-26
  • 打赏
  • 举报
回复
mark
levinknight 2006-05-25
  • 打赏
  • 举报
回复
mark
oldhunter 2006-05-23
  • 打赏
  • 举报
回复
服务器端:
namespace RemoteServer
{
public class Scoop : MarshalByRefObject
{
public Scoop()
{
}

public string GetTheScoop(string name)
{
return "Here's the scoop, "
+ Thread.CurrentPrincipal.Identity.Name + "!";
}
}
}
配制文件:
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall"
type="RemoteServer.Scoop,RemoteServer"
objectUri="Scoop.soap" />
</service>
</application>
</system.runtime.remoting>
<system.web>
<authentication mode="None" />
<authorization>
<deny users="?" />
</authorization>
</system.web></configuration>

客户端:
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new HttpClientChannel());
RemotingConfiguration.RegisterWellKnownClientType(
typeof(RemoteServer.Scoop),
"http://localhost/ScoopRemoting/Scoop.soap");

Scoop srv = new Scoop();

IDictionary props = ChannelServices.GetChannelSinkProperties(srv);
props["username"] = "test";
props["password"] = "test";

string s = srv.GetTheScoop("Greg");
Console.WriteLine(s);
}

如果这样做的话,别人写个客户端不是可以随便模仿一下登录?
如果限制角色:
<authorization>
<allow role="aaaa" />
<deny users="*" />
</authorization>

别人如果知道你的角色是什么, 也可以写个客户端模仿吧?
Brunhild 2006-05-23
  • 打赏
  • 举报
回复
mark
Koala_sea 2006-05-23
  • 打赏
  • 举报
回复
UP
oldhunter 2006-05-17
  • 打赏
  • 举报
回复
up
oldhunter 2006-05-13
  • 打赏
  • 举报
回复
那用CallContext绑定用户信息也可以吧?
"在每个远程对象的方法或属性开头都进行验证" 是不是有点麻烦? 能不能把某个类限定给指定角色? 用什么特性.

这里的Facade也是远程的吗? 本地是不是不安全?
cll0320 2006-05-13
  • 打赏
  • 举报
回复
"在每个远程对象的方法或属性开头都进行验证"
这个是可以的。
但要记住远程对象和一般的本地对象不一样。
通常远程访问可以用Facade模式来实现,这样只需要在Facade对象中验证就可以。
对本地的业务对象没有影响。
oldhunter 2006-05-13
  • 打赏
  • 举报
回复
"在每个远程对象的方法或属性开头都进行验证" 是不是有点麻烦?

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧