cod*_*ner 7 security .net-4.0 code-access-security
我有一个[AllowPartiallyTrustedCallers]类库,包含System.DataAnnotations.ValidationAttribute的子类型.该库用于WCF服务的合同类型.
在.NET 2/3.5中,这很好用.但是,从.NET 4.0开始,在Visual Studio调试器中运行服务的客户端会导致异常" 类型的违反继承安全规则:'(我的ValidationAttribute的子类型)'.派生类型必须与基类型的安全可访问性匹配或者不太容易访问. "(System.TypeLoadException)
仅当满足以下所有条件时,才会出现错误:
基本上,在Visual Studio.NET 2010中:
.
using System;
[assembly: System.Security.AllowPartiallyTrustedCallers()]
namespace TestingVaidationAttributeSecurity
{
public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
{ }
[MyValidation]
public class FooBar
{ }
class Program
{
static void Main(string[] args)
{
Console.WriteLine("ValidationAttribute IsCritical: {0}",
typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical);
FooBar fb = new FooBar();
fb.GetType().GetCustomAttributes(true);
Console.WriteLine("Press enter to end.");
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
按Ctrl-F5(无需调试即可启动),一切正常,无异常...
奇怪的是,根据您运行程序的方式(F5或Ctrl + F5),ValidationAttribute将是或将不是安全关键.如上面代码中的Console.WriteLine所示.但话说回来,这似乎与其他属性(和类型?)一起发生.
现在问题......
为什么在从ValidationAttribute继承时会出现此行为,但在从System.Attribute继承时却没有?(使用Reflector我在ValidationAttribute类或它的程序集中找不到特殊设置)
我该怎么做才能解决这个问题?如何保持MyValidationAttribute继承自AllowPartiallyTrustedCallers程序集中的ValidationAttribute而不将其标记为SecurityCritical,仍然使用新的.NET 4级别2安全模型并仍使用VS.NET调试主机(或其他主机)?
非常感谢!鲁迪
为什么从 ValidationAttribute 继承时有此行为,但从 System.Attribute 继承时却没有?(使用 Reflector 我没有在 ValidationAttribute 类或其程序集上找到特殊设置)
这是因为 System.ComponentModel.DataAnnotations 程序集是有条件的 APTCA,即它标记有以下属性。
[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]
Run Code Online (Sandbox Code Playgroud)
Visual Studio 启动主机进程的方式导致 CLR 不遵守此程序集上的 APTCA,即使默认 AppDomain 是完全受信任的。这意味着 DataAnnotations 程序集中的所有类型和方法都是 SecurityCritical。由于安全透明类型 (MyValidationAttribute) 无法从安全关键类型 (ValidationAttribute) 继承,因此会引发此异常。
我能做些什么来解决这个问题?如何在AllowPartiallyTrustedCallers 程序集中保持MyValidationAttribute 继承自ValidationAttribute,而不将其标记为SecurityCritical,仍然使用新的.NET 4 2 级安全模型,并且仍然使用VS.NET 调试主机(或其他主机)使其工作?
这似乎是 VS 主机的一个错误,这对您的情况来说是不幸的。另一方面,您应该真正确定您希望您的程序集是 APTCA。如果有必要,那么您有几个选择。
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |