我正在尝试构建一个简单的模型。托管控制台应用;可信API组件和低信任客户端插件程序集。为此,我创建了一个控制台应用程序,它构建了具有最小权限的最小appdomain,我构建了一个可信API并签名,将“API”程序集加载到新域并称为“文件写入”方法。我希望这个调用能够通过,因为据我所知,如果强名称程序集(signed)默认加载到任何域,它的行为就像SecurityCritical一样。 但令我惊讶的是,汇编方法引发了异常System.Security.Permissions.FileIOPermission。
由于某种原因,调用crFile()方法会导致安全性异常。令人惊讶的是,FileReaderThing类的构造函数中的相同调用顺利进行,没有例外。
请帮忙
以下是Main的代码
class Program
{
const string APIDLLPath = @"C:\prototypes\sandboxes\trustedlib.dll";
static void Main(string[] args)
{
PermissionSet restrictedPerms = new PermissionSet(PermissionState.None);
restrictedPerms.AddPermission( new SecurityPermission(SecurityPermissionFlag.Execution));
AppDomainSetup appDomainSetup = new AppDomainSetup
{
ApplicationBase = @"C:\prototypes\sandboxes",
};
Assembly a = Assembly.LoadFile(APIDLLPath);
StrongName apiStrongName = a.Evidence.GetHostEvidence<StrongName>();
AppDomain sandbox = AppDomain.CreateDomain(
"Sandbox", null, appDomainSetup, restrictedPerms, apiStrongName);
try
{
//object o = sandbox.CreateInstanceFromAndUnwrap(APIDLLPath,
// "TrustedLib.FileReaderThing");
ObjectHandle o = Activator.CreateInstanceFrom(sandbox, APIDLLPath,
"TrustedLib.FileReaderThing");
IFileReaderThing ifl = (IFileReaderThing)o.Unwrap();
ifl.crFile();
}
catch (Exception exc)
{
Console.WriteLine( "exception: a= {0}\nb = {1}", exc.Message, exc.InnerException);
}
}
}
这是我的简单装配:
**[assembly: AllowPartiallyTrustedCallers]**
namespace TrustedLib
{
public interface IFileReaderThing
{
void crFile();
}
public class FileReaderThing : MarshalByRefObject, IFileReaderThing
{
**[SecuritySafeCritical]**
public FileReaderThing()
{
Console.WriteLine("FileReaderThing ctor");
crFile();
}
public void crFile()
{
try
{
**(new PermissionSet(PermissionState.Unrestricted)).Assert();**
var file = new System.IO.StreamWriter(@"c:\katia\troha.txt", true);
file.WriteLine("troha");
file.Close();
}
catch (Exception exc)
{
Console.WriteLine("exception {0}", exc.Message);
}
}
}
}
我在安全挑战函数crFile中添加了一个声明(下面),添加了程序集范围属性AllowPartiallyTrustedCallers]并使用SecuritySafeCritical属性修饰了crFile函数,一切都开始工作。我仍然不明白为什么需要“断言”调用,但它有效
(new PermissionSet(PermissionState.Unrestricted)).Assert();