有谁知道在ASP.net中实现这样的安全模块:应用中的URL或资源
有多个操作过程,比如查看,创建,更新,删除。如果可以在操作上
(而不是在资源上)控制用户的访问,这样就很有用。可以使asp.net
页面可以为相关的用户得到操作清单,实现权限控制。我已经通过实现Ihttpmodule接口实现了用户的验证。现在,想可以一步
完善这个安全模块,望各位可以一起提建议或交流
我指login 成功以后,进入一个asp.net的页面,比如http://mysite/test.asp.net(webform),里面有3按钮bt_add,bt_update,bt_check,根据登陆用户的权限不同,如经理有这3个按纽的全部执行权限,而开单人员只有bt_add,bt_update的功能,不可以执行bt_check按纽。我想实现的功能呢,就是构建一个安全模块:
1:可以取得各个页面中的按纽的name,text,按纽所在的页面(webform)的name放在database里面。2:给每个role或user,根据user权限级别高低,设置页面(webform)里面按纽可否执行,这些信息就存在database中3:应用执行时,已通过验证的user,根据usid从database取出对各个页面(webform)的按扭(操作)清单,放在全局缓存中。用户在页面对按扭执行时,就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。
这样就实现了对按扭,也就是实现了操作上的授权安全。4:如果可能的话,对httpapplication对象处理 AuthorizeRequest 事件应用程序级 (global.asax) 或者Http Module (实现 IHttpModule),实现第3步中的“就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。”
以上,就是我要实现的自定制Web授权。第1步和第3步是困难所在,望楼上的
有多个操作过程,比如查看,创建,更新,删除。如果可以在操作上
(而不是在资源上)控制用户的访问,这样就很有用。可以使asp.net
页面可以为相关的用户得到操作清单,实现权限控制。我已经通过实现Ihttpmodule接口实现了用户的验证。现在,想可以一步
完善这个安全模块,望各位可以一起提建议或交流
我指login 成功以后,进入一个asp.net的页面,比如http://mysite/test.asp.net(webform),里面有3按钮bt_add,bt_update,bt_check,根据登陆用户的权限不同,如经理有这3个按纽的全部执行权限,而开单人员只有bt_add,bt_update的功能,不可以执行bt_check按纽。我想实现的功能呢,就是构建一个安全模块:
1:可以取得各个页面中的按纽的name,text,按纽所在的页面(webform)的name放在database里面。2:给每个role或user,根据user权限级别高低,设置页面(webform)里面按纽可否执行,这些信息就存在database中3:应用执行时,已通过验证的user,根据usid从database取出对各个页面(webform)的按扭(操作)清单,放在全局缓存中。用户在页面对按扭执行时,就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。
这样就实现了对按扭,也就是实现了操作上的授权安全。4:如果可能的话,对httpapplication对象处理 AuthorizeRequest 事件应用程序级 (global.asax) 或者Http Module (实现 IHttpModule),实现第3步中的“就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。”
以上,就是我要实现的自定制Web授权。第1步和第3步是困难所在,望楼上的
我们公司开发的电力系统就是这样做的,每个人的可操作权限都不同,还有权限组,管理也方便。
怎么.net继承啊
用ihttpmodule技术,我写了一个控制类,这个类继承this.system.web.ui.page,然后用this.page.findcontrol找控件,找不到,就是这样失败了
这样调用
public class HttpModuleApp:IHttpModule
{
HttpApplication app;
DateTime dtstart=DateTime.Now; public HttpModuleApp()
{
}
HttpContext Context
{
get
{
return app.Context;
}
}
public void Init(HttpApplication application)
{
if(app!=null) throw(new InvalidOperationException());
app=application;
application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
application.AuthenticateRequest += (new EventHandler(this.Application_AuthenticateRequest));
app.Error+=new EventHandler(app_Error);
}private void Application_AuthenticateRequest(object sender,EventArgs e)
{//控制类 HttpContext Context = HttpContext.Current;
userchecher dd=new userchecher()
//调用这个控制函数
dd.checher(); }
控制类:
public class RoleRightPropertyControl:System.Web.UI.Page
{
//实现权限的函数
/// <summary>
///
/// </summary>
/// <param name="e"></param>
/// <summary>
/// 控制用户功能是否能用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checher()
{
HttpContext Context = HttpContext.Current;
DataSet ds=new DataSet();
if((DataSet)Context.Items["dtGetRigthRoles"]==null)
{
RoleRightPropertyControl.GetRoleRightProperty();
}
ds=(DataSet)Context.Items["dtGetRigthRoles"];
string sfuntionID="";
int y=ds.Tables[0].Rows.Count;
for (int x=0;x<y;x++)
{
if((Convert.ToInt32(ds.Tables[0].Rows[x][0]))==sfuntionID)
{
int j=ds.Tables[0].Columns.Count;
for(int i=3;i<j;i++)
{
string functionstr=(ds.Tables[0].Columns[i].ToString()).Trim();
System.Web.UI.WebControls.Button functionControl =(System.Web.UI.WebControls.Button)this.Page.FindControl(functionstr);
if(functionControl!=null)
{
if((Convert.ToBoolean(ds.Tables[0].Rows[x][i]))==true)
{
functionControl.Enabled=true;
}
else
{
functionControl.Enabled=false;
}
}
}
}
}
}
对httpModule不熟,盼望leiMZ说明一下,不要吊我们胃口 :p
这个是应该 其他好象就不对了
LeiMZ(神仙)
我的水平比较低吧,能否提供点伪代码吗?
我这个问题已经好久了都不能解决啊,
leiMZ说明一下
能说明更详细的吗?
朋友,能否提供你的伪代码给我参考?我在这里多thanks了,
如果有更好的代码,应该是比较好的,但我现在用另外的一种方法了,就是用两个实现Iprincipal和Iidentity的类
但用ihttpmodule我真的没有办法了,但我想写一个页面的基类,每一个页面都继承这个基类,这样我是可以实现了,但我总不想都在这个页面都继承,能否可以自动继承吗
如果是前期绑定——也就是只有设计时需要修改而运行时不需要动态须改,那么使用类继承是个很好的方法。整页验证当然继承Page类啦,而你是针对某一个WebControl验证那就继承你需要验证功能的WebControl,非PostBack的时候该WebControl验证权限并确定自己是否可见,当PostBack的时候该WebControl验证是否足够权限来冒泡有关事件(或者进行有关操作)。这样做你可以在VS.NET的界面里面直接设置每一个控件的权限等级,设计时会方便很多。
如果是后期绑定——用你的方法也行,不过好像比较麻烦,我还是建议你继承WebControl来做。你需要为每一个需要绑定的控件提供安全有关的数据。这个怎么说好呢,我的意思是你为WebControl提供一种类似数据绑定的方法,不过它不是绑定DataSet/DataTable等而是绑定你自己的一个/一些安全类,这些安全类提供安全校验结果。
WebControl这个设计方式是怎么样的呢?能否说详细点,不管是前期的还是后期的,只要能比较好的执行他们,也为了以后可以扩展他们,我的意思就是不要都在这一个页面都写代码这样好烦啊,扩展也不好啊,对吗?所以我现在唯一的方法就是写一个页面的基类,每一个页面都继承这个基类,这样扩展性也算比较好吧,对吗?但不我知道你的WebControl方法是否更好呢?好像你的WebControl方法是都在每一个页都添加这个webcontrol自定义控件吗
堆栈跟踪哪边显示找了好几个地方
登录代码为
RightRoleCheckerPrincipal dd=new RightRoleCheckerPrincipal(txt_loginName.Text.Trim(),txt_password.Text.Trim()); if(dd.Identity.IsAuthenticated)
{
Context.User=dd;
Response.Redirect("WebForm3.aspx");
}
else
{Context.User=dd;
Response.Redirect("WebForm3.aspx"); }
这个可以测试出Context.User.Identity.IsAuthenticated为true
但我在另的类内,如
using System;
using System.Collections;
using System.Security.Principal;namespace Test
{
/// <summary>
/// GGECPage 的摘要说明。
/// </summary>
public class GGECPage:System.Web.UI.Page
{
public GGECPage()
{
}
protected override void OnInit(EventArgs e)
{ base.OnInit (e); this.Load +=new EventHandler(MyPage_Load);
this.Error+=new EventHandler(PhilePage_Error); } //在页面加载的时候从缓存中提取用户信息
private void MyPage_Load(object sender, System.EventArgs e) {
if(Context.User.Identity.IsAuthenticated)
{
RightRoleCheckerPrincipal principal = new RightRoleCheckerPrincipal(userMessage["UserID"].ToString(),userMessage["UserPassword"].ToString());
Context.User = principal;
System.Web.UI.WebControls.Button functionControl =(System.Web.UI.WebControls.Button)this.Page.FindControl("testbtn");
if(functionControl!=null)
{
functionControl.Enabled=true;
}
System.Web.UI.WebControls.Button functionControl1 =(System.Web.UI.WebControls.Button)this.Page.FindControl("testbtn2");
if(functionControl1!=null)
{
functionControl1.Enabled=false;
}
} }
}
为什么在这里:Context.User.Identity.IsAuthenticated为false呢?
哪一位高手能提示一下吗?
配置文件添加了
<identity impersonate="true" />
<authentication mode="Forms">
<forms loginUrl="WebForm1.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication> <authorization>
<!--
<deny users="?" />
-->
<allow users="*" />
</authorization>为什么会这样呢?我真的的搞不懂啊
身份令牌或者session就可以
你这样做是有问题的.确实.可以按你的思路可以实现操作上的权限控制.
但是不应该是在 IHttpHander的层面上。因为在页面在执行这个这里的时候很多的控件都没有进行初始化。 还有你的认证机制在这个时候还没有发生。所有会出现 Context.User.Identity.IsAuthenticated = false的情况。因此应该是在page的类上继承。你可以这样写一个所有的页面继承自page 中比如 BasePage 如下代码:BasePage.aspx
namespace WebApplication1
{
/// <summary>
/// Class2 的摘要说明。
/// </summary>
public class BaseClass :System.Web.UI.Page
{
public BaseClass()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.Load+=new EventHandler(BaseClass_Load);
} private void BaseClass_Load(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)this.FindControl("LinkButton1");
lb.Text = "p chengde";
}
}
}
文件 WebForm4.aspx
namespace WebApplication1
{
/// <summary>
/// WebForm4 的摘要说明。
/// </summary>
public class WebForm4 : BaseClass
{
public System.Web.UI.WebControls.LinkButton LinkButton1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load); }
#endregion
}
}页面执行后你会发现 在BasePage 类中已经更改了 LinkButton的值。如果满意就给分吧。呵呵。