从.NET Framework 1.0开始,微软就引入代码访问安全(CAS)模型,这是一项用于分配和管理托管代码的工具。.NET Framework 4.0 Beta 2并不赞成使用CAS,故默认情况下已经关闭该功能,而引入了第二级安全透明度的(Security Transparency Level 2)安全模型。所以本篇文主要了解CAS用法。
代码访问安全性(CAS)能最大限底地防止用户无意识地执行不安全代码。通过使用CAS,就能够限制代码对资源的访问。用例子说明。
例,我们新建一个Winform程序,要限制界面和文件IO为最小权限,并拒绝其它没有进行请求的权限。
方法,打开项目中的Properties文件夹中的AssemblyInfo.cs,并在其中加入以下代码。各代码的意思已在备注中说明。
#region 设置程序集权限
using System.Security;
using System.Security.Permissions;
//用户界面权限
[assembly: UIPermission(SecurityAction.RequestMinimum, Unrestricted = true)]
//文件IO权限
[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted = true)]
//权限集,拒绝其它没有进行请求的权限
[assembly: PermissionSet(SecurityAction.RequestOptional, Unrestricted = false)]
#endregion
using System.Security;
using System.Security.Permissions;
//用户界面权限
[assembly: UIPermission(SecurityAction.RequestMinimum, Unrestricted = true)]
//文件IO权限
[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted = true)]
//权限集,拒绝其它没有进行请求的权限
[assembly: PermissionSet(SecurityAction.RequestOptional, Unrestricted = false)]
#endregion
另外可以在代码中配置权限,如下。
1)例,使用声明性权限
//声明性权限要求
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
private void btnIoPermission_Click(object sender, EventArgs e)
{
using (StreamReader stream = new StreamReader("CarList.xml"))
{
MessageBox.Show(stream.ReadToEnd());
}
}
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
private void btnIoPermission_Click(object sender, EventArgs e)
{
using (StreamReader stream = new StreamReader("CarList.xml"))
{
MessageBox.Show(stream.ReadToEnd());
}
}
2)例,使用命令性权限
private void btnIo3_Click(object sender, EventArgs e)
{
//命令性要求
FileIOPermission filePerm = new FileIOPermission(PermissionState.Unrestricted);
//在运行时确定当前主体是否与当前权限所指定的主体相匹配。
filePerm.Demand();
using (StreamReader stream = new StreamReader("CarList.xml"))
{
MessageBox.Show(stream.ReadToEnd());
}
}
{
//命令性要求
FileIOPermission filePerm = new FileIOPermission(PermissionState.Unrestricted);
//在运行时确定当前主体是否与当前权限所指定的主体相匹配。
filePerm.Demand();
using (StreamReader stream = new StreamReader("CarList.xml"))
{
MessageBox.Show(stream.ReadToEnd());
}
}