授权问题(2000分)

cgq214 2002-11-20 03:48:04
有谁知道在ASP.net中实现这样的安全模块:应用中的URL或资源
有多个操作过程,比如查看,创建,更新,删除。如果可以在操作上
(而不是在资源上)控制用户的访问,这样就很有用。可以使asp.net
页面可以为相关的用户得到操作清单,实现权限控制。

我已经通过实现Ihttpmodule接口实现了用户的验证。现在,想可以一步
完善这个安全模块,望各位可以一起提建议或交流(可以给分到2000分)。
msn:cgq214@hotmail.com
QQ:10032532
...全文
21 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgq214 2002-12-07
  • 打赏
  • 举报
回复
to smilefox(笑面狐)
你说的这些,我其实也研究过,但是,我感觉在大系统中不是很实用
所有,才来这里问.不知道你应用到实际中了吗?

我不知道级数和分数的关系,我只知道自己有5000多分,
其实很多人回答我的问题,不是为了分数,而是为了解决这个问题。
smilefox 2002-12-05
  • 打赏
  • 举报
回复
msdn的说明;

实现基于角色的安全性
Microsoft .NET 框架提供基于角色的安全性模型以允许组件确定授权哪些用户执行操作。尽管发布时 Duwamish 7.0 示例不使用“基于角色”的安全性,但以下概念阐释了许多实现之一的一些详细信息。此特定实现假定使用的是基于身份验证的 ASP 窗体,在这种情况下,将向浏览器颁发 FormsAuthentication 票,并且在将该票呈回给服务器时要重新进行身份验证。票 (Cookie) 可以自动生成或显式生成。在此示例中显式生成它以支持添加角色。

实现基于角色的安全性:

建立角色和映射用户
用户到角色的映射可以存储在 Active Directory、SQL Server 表等数据存储区中。余下的步骤假定角色是从 SQL Server 数据库中提取的。
在运行时分配角色
当用户登录时,应用程序从数据库或目录服务中查找角色。然后将角色放置在 FormsAuthenticationTicket 中以避免后面对数据存储区的请求,从而提高性能。角色分配在以下代码中进行演示,这可在成功进行身份验证之后,在登录页后面的代码中实现。角色是一个帮助器类(在此未显示),当调用构造函数时,它从角色数据库中提取角色并将它们放置到内部角色数组中。由于我们正在身份验证票中将角色存储为字符串,因此类的 ToString 方法将数组转换为字符串表示形式。在此示例中,角色帮助器类接受三个参数:已验证身份的用户、应用程序名称和到包含角色的数据库的连接字符串。
HttpContext currentContext = HttpContext.Current;
string formsCookieStr = string.Empty;
Roles userRoles = new Roles(UserId,SFConfig.ApplicationName,SFConfig.RoleDBConnString);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // version
UserId, // user name
DateTime.Now, // issue time
DateTime.Now.AddMinutes(30), // expires
false, // persistent
userRoles.ToString() // user data
);

// get the encrypted representation suitable for placing in a HTTP cookie
formsCookieStr = FormsAuthentication.Encrypt(ticket);
HttpCookie FormsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, formsCookieStr);
currentContext.Response.Cookies.Add(FormsCookie);
用户后面提交的请求将在请求标题中包含身份验证票,而服务器上的运行库将基于已登录用户的详细信息创建身份和用户。然而,并不会自动提取和分配添加到身份验证票的角色。要使用适当的用户角色设置用户,需要在下面的步骤中描述的运行线程上创建一个新用户并进行替换。

用户替换
用户对象表示代码所运行的安全上下文。实现基于角色的安全性的应用程序将基于与用户对象关联的角色来授予权限。若要设置每次请求时与用户关联的角色,在此实现中,应在 Global.asax 的 Application_OnAuthenticationRequest 函数中替换用户,如下所示:
protected void Application_OnAuthenticateRequest(Object src, EventArgs e)
{
HttpContext currentContext = HttpContext.Current;
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if( HttpContext.Current.User.Identity is FormsIdentity )
{
FormsIdentity id = HttpContext.Current.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;
// Roles is a helper class which places the roles of the
// currently logged on user into a string array
// accessable via the value property.
Roles userRoles = new Roles(userData);
HttpContext.Current.User = new GenericPrincipal(id, userRoles.Value);
}
}
}
}
检查角色成员
现在用户的角色已在线程的当前用户中可用,代码可以使用此角色信息来允许或拒绝对某些功能的访问。这可以通过以下的三种方式之一来实现:
代码的属性。

[PrincipalPermissionAttribute(SecurityAction.Demand, Role = "MyRole")]
IsInRole 方法调用

使用用户的 IsInRole 方法以编程方式评估角色成员。

Web.Config

修改 Web.Config 文件,根据角色成员关系允许或拒绝对页的访问,如下所示:

<authorization>
<allow users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />

<deny users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />
</authorization>
smilefox 2002-12-05
  • 打赏
  • 举报
回复
"你才1级就能给2000分,可信度很低"是一句实话;-)


因为2000分太吸引人了。。。。。好多人回帖子

其实你的问题具有普遍性:说白了,就是

1。安全认证
2。角色分配

关于这个问题最权威的资料可能就是微软的Building Secure ASP.NET Applications PDF文件,完整的例子在Visual Studio 示例:Duwamish 7.0 安全性 [C#]一节中。

好多人问类似的问题,可以把它整理出来




龙腾九霄 2002-12-05
  • 打赏
  • 举报
回复
你才1级就能给2000分,可信度很低
xuzhenhua21 2002-12-02
  • 打赏
  • 举报
回复
想想如果是分模块开发的话,你能要求别人的控件按你的要求去命名吗,不太现实
是你开发的东西别人就能用,不是别人按你的要求去开发,在中国的大多数公司里
系统设计就是一个P话!
superenergy 2002-12-02
  • 打赏
  • 举报
回复
你好,下面就是我的代码,不是很长所以就懒得写注释了,在IF语句中我列举了几种按钮控件命名的几种可能希望能对你有所帮助
上面粘的有点乱,我整理了一下

public void pageInit( System.Web.UI.ControlCollection webcls)
{

foreach (System.Web.UI.Control ctrl in webcls)
{
if(ctrl.GetType()==typeof(System.Web.UI.WebControls.Button))
{
System.Web.UI.WebControls.Button btn = (System.Web.UI.WebControls.Button)ctrl;
if(btn.ID=="btnAdd" || btn.ID=="btnChange"||btn.ID=="btnDelete" ||btn.ID == "btn_Add"||btn.ID=="btn_Edit"||btn.ID=="btn_Delete"||btn.Text=="添加"||btn.Text=="编辑"||btn.Text=="修改"||btn.Text=="删除")
{
btn.Enabled=false;
}
}
this.pageInit(ctrl.Controls);
}
}
superenergy 2002-12-02
  • 打赏
  • 举报
回复
你好,下面就是我的代码,不是很长所以就懒得写注释了,在IF语句中我列举了几种按钮控件命名的几种可能希望能对你有所帮助

public void pageInit( System.Web.UI.ControlCollection webcls)
{

foreach (System.Web.UI.Control ctrl in webcls)
{
if(ctrl.GetType()==typeof(System.Web.UI.WebControls.Button))
{
System.Web.UI.WebControls.Button btn = (System.Web.UI.WebControls.Button)ctrl;
if(btn.ID=="btnAdd" || btn.ID=="btnChange"||btn.ID=="btnDelete" ||btn.ID == "btn_Add"||btn.ID=="btn_Edit"||btn.ID=="btn_Delete"||btn.Text=="添加"||btn.Text=="编辑"||btn.Text=="修改"||btn.Text=="删除")
{
btn.Enabled=false;
}
}
this.pageInit(ctrl.Controls);
}
}
cgq214 2002-12-02
  • 打赏
  • 举报
回复
to superenergy(劲量)
谢谢你了,你的方法在 一定范围内还是可行的 ,不过可以扩展。

to xuzhenhua21
也不一定哦,如果分层开发就有可能作到规范。这里的按钮控制,其实就
在表现层,就这入口层,当然可以作到规范命名,一般这层2个人开发就够了,而不是在逻辑业务层。
superenergy 2002-12-01
  • 打赏
  • 举报
回复
如果你可以规范化你空间的命名或者按钮空间TEXT属性(如插入操作都叫添加)的命名的化可以使用如下办法:
1、编写一个方法(比如叫pageCtrl),输入一个PAGE的实例,可以遍历该实例中的所有控件,你可以在该方法中直接控制.ID=="某个名称"或.TEXT=="某个名称"的控件的各种属性。
2、在每个页面的formload事件中调用该函数,如pageCtrl(this);

步骤1的代码我公司的计算机中有,如果你对此方法感兴趣并且星期一还没找到更好的方法的话的话发电子邮件给我(dengweipeng@263.net),我会把代码贴给你
cgq214 2002-12-01
  • 打赏
  • 举报
回复
to xuzhenhua21 :
感觉你意见很有建设性,可以再具体写吗,比如可以写出代码或伪代码吗
这样我才可以理解你的意思,和你更好得交流!

很感谢你,分数一定会有的,哈哈!
hikele 2002-11-30
  • 打赏
  • 举报
回复
关注,收藏
ykn 2002-11-30
  • 打赏
  • 举报
回复
想把权限做得好一些,必须设计一个优秀的数据库结构,再配上你的编程代码,足够了。
QQ:37494821
angel_lee 2002-11-30
  • 打赏
  • 举报
回复
正要做这部分,
luhanzhang(夏日凉风) 的方法太不方便,也不专业,同一个页面的处理要分成四页?

ykn(ykn) i agree with him.
luhanzhang 2002-11-30
  • 打赏
  • 举报
回复
我的建议:
把查看,创建,更新,删除四个模块独立出来,放在不同的四个WebForm,在数据库里根据不同的用户分配权限,如果用户没有权限,则不显示其相应的WebForm,这样也比较好控制。
如果按照你的想法完全可以做到,不过比较麻烦,项目比较大,按照我的想法做可能比较合适。按照你的想法,可以在数据库建立权限表,对按钮为每个用户分配权限,登录时根据Forn验证的UserID初始化权限,点击按钮时根据UserID判断用户对按钮是否有操作权限!我也在搞权限控制,有机会可以继续交流:lhz168@netease.com
xuzhenhua21 2002-11-30
  • 打赏
  • 举报
回复
我刚来这你要给分的,要守信用,
xuzhenhua21 2002-11-30
  • 打赏
  • 举报
回复
这样不用记忆控件名,也不用记忆页名,
在PAGE-LOAD中调用相关的方法就可以很灵活,
在进行按钮验证时就调用相应的方法,
很实用的
xuzhenhua21 2002-11-30
  • 打赏
  • 举报
回复
给一点建议,你做一个项目,负责的恰巧是权限验证
使用三个层次:
1 角色类
2 模块类
3 操作类
使用集合管理器 分别管理下一级的对象,在按钮上进行验证时 你可以
使用操作类的对象,可以根据用户登录时的不同角色生成动态菜单
nkdzc 2002-11-30
  • 打赏
  • 举报
回复
不太明白你为什么非要把权限跟按钮绑的那么紧

我现在也在做一个项目,其中就涉及到用户权限的问题,我用的方法烦一点,可能和你的思路不一致,但是运行的很好

每个界面的操作权限基本上可以分为浏览,添加,删除,修改,还有信息的发布。这些权限有一个专门的模块进行控制,这个模块的一个典型函数就是判断用户是否具有相应的权限isAuthority(AuthorityName,UserID).浏览是最低权限,可以在Page_Load中进行判断,如果没有该权限,则转到错误处理页,添加,删除和修改都是有相应的按钮控制,所以如果用户没有相应的权限,该按钮的Enabled=false 或visible=false,信息发布在我这里是这样的,在Grid中有一个发布列,如果用户具有发布权限,则显示该列,否则隐藏,当然,在信息发布界面还要进行权限的判断。
权限管理有一个专门的模块,.vb或编译成dll,想用的时候调用。有专门的权限分配管理界面。原来系统中是分角色和权限的,后来因为权限名比较少,直接操作权限比较灵活,就把角色去掉了。
我觉得使用这种方式比存按钮要好,不用管按钮的名字,权限的名字容易记忆,比如“会议记录添加权限”
不知道是不是你的意思
cgq214 2002-11-30
  • 打赏
  • 举报
回复

"当前页面的名称就直接用当前资源的虚拟路径,这样可以保证所有页面的标识是唯一的。例如/ppmm/apabe.aspx。文件名好象还不行,因为不同目录可以有相同文件名。
在httpmodule可以得到这个信息:
app.Context.Request.FilePath
//app 是 httpapplication "

如果这样,我们在数据库中存的“前页面的名称”也要手工添加了?
“前页面的名称”值填什么呢
cgq214 2002-11-30
  • 打赏
  • 举报
回复
to nkdzc:
先感谢你,
你这样的话,要在每个页面中写代码吗?
我想实现的时候,不用在页面中(webform)写代码了,只要在这个页面的基类(page类)里面就可以了。因为我是在ASP.NET 里面实现。
你的思想,从另外一个方面考虑,很不错!

toluhanzhang(夏日凉风)
"把查看,创建,更新,删除四个模块独立出来,放在不同的四个WebForm"
可以具体些吗,这样我不大容易完全理解你的意思
加载更多回复(38)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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