扩展.net安全机制
.net安全机制涉及很多方面,这里只讲基本的基于角色的安全机制。.net提供了PrincipalPermission类,PrincipalPermissionAttribute类以及IPrincipal派生类支持基于角色的安全控制。内建的支持使用很方便,但灵活性却不高。举个例子吧:
class SomeClass
{
[PrincipalPermission(SecurityAction.Demand, Role="admin"]
public void SomeMethod()
{
}
}
上面的代码表明只有拥有admin角色的用户才能访问SomeMethod方法,上面采用了声名式的方式,也是最方便的,当然也可以在代码中显示调用Demand检查权限或者调用IsInRoll更灵活的控制。在运行时,CLR会自动检查当前用户的Principal,检查admin是否是Principal的一个角色,关于如何为Principal对象设置角色,这里就略去了。
这样的方式虽然简单,却往往不能直接使用,因为在实际的项目中,我们往往不能在编码时确定特定角色所能执行的功能。也就是说,我们需要在运行时改变一个角色所能访问的功能。这时候,使用PrincipalPermission属性就不能解决问题了,.net似乎没有提供这样的解决方案,幸运的是,.net确实提供了扩展机制,使我们可以编写自己的权限控制机制。
为了实现上述可在运行时修改权限的机制,我们的目标是编写一个类似于PrincipalPermission的属性,让我们可以这样写:
[CustomSecurity(SecurityAction.Demand, FuncID=“Func1“]
public void SomeMethod()
{
}
回到正题,至少对于权限控制的主题,.net实际上提供了截获调用的方法,而且非常简单。要做到这一点,首先是编写一个CodeAccessSecurityAttribute的继承类,也就是我们的CustomSecurityAttribute类。在这个Attribute类中加入属性FuncID,并在构造函数中调用CodeAccessSecurityAttribute的构造函数。如果对Attribute不熟悉,可以参考这篇文章:
http://www.codeproject.com/csharp/dotnetattributes.asp
CodeAccessSecurityAttribute定义了一个抽象方法CreatePermission,我们必须在继承类中实现这个方法,CreatePermission方法要求返回一个IPermission接口,这个接口也是我们要实现的,在实现IPermission接口之前,我们先看一下CustomSecurityAttribute的完整代码:
[AttributeUsage(AttributeTargets.All, AllowMultiple=false, Inherited=true)]
[Serializable]
public sealed class CustomSecurityAttribute : CodeAccessSecurityAttribute
{
public CustomSecurityAttribute(SecurityAction action) : base(action)
{
}
private string _funcID;
public string FuncID
{
get
{
return _funcID;
}
set
{
_funcID = value;
}
}
public override IPermission CreatePermission()
{
return new CustomPermission(_actionDomain);
}
}
很简单吧,上面代码里的CustomPermission类是实现了IPermission接口的类,我们接下来要实现它。
又下班了,下次再写
posted on 2004-04-29 17:10 vibration 阅读(2069) 评论(3) 编辑 收藏 举报