关于三层结构的身份验证问题(200分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
在单层数据库程序(Desktop Database Application)和客户/服务器数
据库程序(Client/Server Database Application)中,用户身份的验
证很明显应该由操作系统(OS)和数据库管理系统(DBMS)来完成。
而在多层(Muti-Tier)应用程序中,由于客户端和数据库管理系统中有了
一个中间层,使直接利用数据库管理系统的安全机制变的比较困难。而如果
自己建立一套安全验证机制,不但劳民伤财,而且安全性未必可靠。
请问诸位,在三层中如何更好的对用户进行验证?
比如:Borland Midas, Microsoft RDS, ASTA, MID-WARE ect.
 
我不懂,不过"delphi核心编程技术"上说,可以加一个"安全服务中间件",
做多层体系结构.
 
我虽下在作三层结构,可这个不归我管,我也对网络的安全不懂。
但我以前好象见过cAkk所说的"安全服务中间件",应该有这东西。
 
MTS在应用服务器之前允许加入安全模块。
 
说到MTS,让我再翻翻"核心技术编程". (别笑话,这是我唯一的一本参考书,就他最便宜了)
"MTS为应用服务器提供了基于角色的安全机制,每个客户都扮演着一种角色,决定了
他们能否访问远程数据模块的接口.TMTSDataModule有一个函数叫IsCallerInRole,
可以用来检查客户的角色,然后有条件的开放该角色所允许的功能".
打字真累. :-(
 
connection有一个onlogin的事件,可以用来做身份验证,
另外,据说可以为不同的用户分层共享同一“应用服务器”,不知谁 人
有这方面的经验?
 
我晓得在哪里可以做验证,不过这样,应用程序服务器做验证,很费力的
我要做一个用户管理块,不如直接用DBMS的来得方便:(
 
没人有兴趣?
 
呵呵, 其实关于权限问题, 各个程序的定义其实都是不一样的, 如果用dbms有非常
大的问题, 如安全性, 另外不能满足所有人的需要. 所以, 还是根据特殊需要来做
吧.
结论是: 自己实现认证!!!
 
打开应用服务器模块的Type Library,在接口下新建一个或若干个Method,在这些
方法中具体定义安全逻辑。然后在客户端程序中的连接控件(如DcomConnection,
SocketConnection等)的AppServer属性后跟上那个方法名(当然要用'.'分隔)再
加上要传递的参数值(这些参数当然是在服务端的Method中定义的)。
简单举个例子,在客户端有个登录对话框,用来获得用户名和口令,而在服务端定义了一个方法:Login(Username,Password:WideString);这样若在客户端用一个
DCOMConnection连接服务端,则可用
DCOMConnection.AppServer.Login('张三','xxxxxxx');来实现对用户身份的验证。
另:小规模的应用最好不要用MTS。
 
cytown:答在题上了,不过说了我不太想听的:((((((
Jing:谢谢,我晓得怎么干,只想知道,哪个好
 
在应用服务器上,定义一个加密验证方法或函数就OK
 
对安全性的考虑是见仁见智的事,我想说一下我的做法,我不用onlogin,我做一个
客户端的Data module,里面有连接服务器(TRemoteServer,TSocketConnection
...),我首先连上远程服务器,(我的服务器端什么时候都允许客户端连接,但有内部
变量控制,不能调用所有的方法,也不能提供Provider,例外的是登录方法),紧跟着
我用TDispatchConnection(dmXXXX.Server).AppServer.登录方法,送给服务器
端用户名,密码,请求种类等参数,由服务器返回相应结果.如果不成功,服务器端的
内部变量锁死所有的方法及属性(Provider),客户端的程序按得到的结果决定,继续
,退出.
当你向客户端送字符串内容及返回值时,你得用自已的算法加密,不然的话,你的
数据就保不住了.
上面是我在做程序时的思路,具体做法就有很大的一堆程序要写,如果兴趣,给我
来信,互相学习.我银子有限,不能长时间在网上.9892#163.net.
所述如有现眼的地方,请批评指正.
 
DCOM好象自行处理网络安全的说
 
skyface:怎么加密验证,如何具体实现,请详细点。
 
赞同cytown的意见,安全自己来实现
首先定一个用户,有一个权限高的数据库账号,程序一般都通过这个账号来访问。
专门做一个网络服务进程,由它更改数据库中这个账号的口令,并同时将这个口令放在个什么别的地方
每个客户进程启动时找它要这个账号的口令,然后再登录数据库

自己设立用户组与用户的概念,不用DBMS的,
继之在应用程序中实现功能区的概念,每个功能区与用户/用户组相对应,
最后再做一个权限管理程序,用来设定哪些用户可以执行哪些功能。
用DBMS的权限,呵呵,苦啊,每个表,每个域都要限制,
理论上是很牢固的,但也有很多缺点:
1)实现上需要非常仔细的规划!
2)不便于将权限交给程序的最终用户来管理
3)难于移植
总而言之,言而总之,从功能上控制权限要比从数据上控制权限要容易方便:)
 
dbms的权限也是十分有问题的, 如, 你要有大量代码处理如果dbms返回access
denied的信息:-(
 
DCOM/DCOM+本身是有权限管理的,
包括某用户对某DCOM server的
1、启动权限
2、访问权限
3、其他,不记得了
可是,实在很可笑,DCOM的权限配置(dcomcnfg.exe)真TMD复杂,
我们往往是给用户赋上所有权限,程序才走得通,所以我至尽
还是不明白该怎么配!
程序内部的权限控制还是应该自己做,因为需求太灵活,
固有的机制恐怕不太可能实现,劳民伤财也没办法,
万里长城不也修起来了么??
如果嫌麻烦,我倒有简单的办法,
1、所有的datarequest,除sql语句外,还增加用户名、口令
app server先检查权限,再打开dataset,返回数据
2、所有的rpc,同上
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部