gpt4 book ai didi

c# - 沙盒异常 "Derived types must either match the security accessibility of the base type or be less accessible."

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:12 25 4
gpt4 key购买 nike

尝试在沙盒应用程序域中启用代码访问安全性时出现以下错误。

类型违反了继承安全规则:“XXX”。派生类型必须与基类型的安全可访问性相匹配或更难访问。

这是我的: 插件程序集有一个实现 sdk 程序集中定义的接口(interface)的类。插件程序集未签名。此外,插件程序集在 AssemblyInfo.cs 中具有 [assembly: SecurityTransparent] 示例:

public Class Bar : AbstractBase
{
// This class implements an abstract method defined in the base class

}

AbstractBase 在 SDK 二进制文件中定义并已签名。此外,当我在执行程序集中创建域时,它被标记为受信任。

[安全安全关键] 公共(public)抽象类 AbstractBase :MarshalByRefObject,IDisposable { public abstract void BaseMethod();

[SecurityCritical]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)]
public override object InitializeLifetimeService()
{
var lease = (ILease)base.InitializeLifetimeService();
if (lease != null && lease.CurrentState == LeaseState.Initial)
{
lease.InitialLeaseTime = TimeSpan.FromHours(1);
lease.SponsorshipTimeout = TimeSpan.FromHours(1);
lease.RenewOnCallTime = TimeSpan.FromHours(1);
}

return lease;
}

protected void MethodFoo()
{
...
}

public virtual Foo FooItIs{get;set;} // Foo is a class which is a MarshallByRefObject and is implemented in the executing assembly
}

这是我在 SDK 二进制文件的 AssemblyInfo.cs 中尝试过的。

[assembly: AllowPartiallyTrustedCallers]
[assembly: SecurityRules(SecurityRuleSet.Level2, SkipVerificationInFullTrust = true)]
//[assembly: SecurityRules(SecurityRuleSet.Level1)]

最后,是创建域并应用安全限制的执行程序集。我在调用 CreateInstanceAndUnWrap 时遇到异常。

private void CreateAppDomain()
{
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationName = "Plugins";
domainSetup.ApplicationBase = Section.Instance.BaseDirectory;
domainSetup.ConfigurationFile = domainSetup.ApplicationName + ".config";
PermissionSet domainPermissions = new PermissionSet(PermissionState.None);

domainPermissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
domainPermissions.AddPermission(new IsolatedStorageFilePermission(PermissionState.Unrestricted));
domainPermissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));

domainPermissions.AddPermission(new System.Net.WebPermission(PermissionState.Unrestricted));
domainPermissions.AddPermission(new System.Net.Mail.SmtpPermission(PermissionState.Unrestricted));

domainPermissions.AddPermission(new System.Configuration.ConfigurationPermission(PermissionState.Unrestricted));
domainPermissions.AddPermission(new System.Data.SqlClient.SqlClientPermission(PermissionState.Unrestricted));

StrongName plugins = typeof(AbstractBase).Assembly.Evidence.GetHostEvidence<StrongName>();
this.appDomain = AppDomain.CreateDomain(domainSetup.ApplicationName, null,
domainSetup, domainPermissions,
plugins);
}

下面是我如何创建一个实例:

action =
this.appDomain.CreateInstanceFromAndUnwrap(
Path.Combine(pluginProperties.AssemblyBaseDirectory, pluginProperties.AssemblyName),
className) as
AbstractBase;

我不确定我遗漏了什么,或者我的架构在代码访问安全性方面是否存在某种错误?感谢您的帮助!

编辑:这是堆栈跟踪。我的 UT 做的事情和上面描述的完全一样

在 System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly 程序集,字符串名称, bool 值 throwOnError, bool 值 ignoreCase,ObjectHandleOnStack 类型) 在 System.Reflection.RuntimeAssembly.GetType(字符串名称, bool 值 throwOnError, bool 值 ignoreCase) 在 System.Activator.CreateInstanceFromInternal(String assemblyFile,String typeName,Boolean ignoreCase,BindingFlags bindingAttr,Binder binder,Object [] args,CultureInfo culture,Object [] activationAttributes,Evidence securityInfo) 在 System.AppDomain.CreateInstanceFrom(字符串 assemblyFile,字符串类型名称) 在 System.AppDomain.CreateInstanceFromAndUnwrap(字符串 assemblyName,字符串类型名称) 在 System.AppDomain.CreateInstanceFromAndUnwrap(字符串 assemblyName,字符串类型名称) 在 ActionProcessorTests.cs 中的 Microsoft.Windows.Infrastructure.MissionControl.Eventing.Agent.Tests.ActionProcessorTests.TestActionExecuted():第 196 行

最佳答案

好吧,这是一篇旧帖子,但我在尝试解决同样的问题时偶然发现了它。问题是您已经用 SecuritySafeCritical 标记了整个 AbstractBase 类,但是 Bar 类,因为它是未签名的,所以必须 安全透明。不允许从 SecuritySafeCritical 类派生 SecurityTransparent 类。

解决方案是从 AbstractBase 类中删除 [SecuritySafeCritical] 属性。因为您已将旧程序集标记为 AllowPartiallyTrustedCallers,所以 AbstractBase 类将默认为 SecurityTransparent,并且 AbstractBase并且 Bar 将是透明的。

然后,当您需要访问 SecuritySafeCriticalSecurityCritical 函数时,您可以将 AbstractBase 中的单个函数标记为 SecuritySafeCritical 。这将允许这些方法访问更受限制的类。

关于c# - 沙盒异常 "Derived types must either match the security accessibility of the base type or be less accessible.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30701616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com