Failure decoding embedded permission set object -
06-16-2004
, 11:53 PM
I am trying to implement a custom CAS Permission/Attribute
pair (The code is at the end of the message). The DLL that
contains this is strong named and is registered in the GAC.
I assert this permission on a method in an exe:
class Class1 {
[STAThread]
[A.XPermission
(System.Security.Permissions.SecurityAction.Assert )]
static void Main(string[] args) {
Console.ReadLine();
}
}
permview /decl on the exe shows:
Method CustomAttrTester.Class1::Main() Assert permission
set:
<PermissionSet class="System.Security.PermissionSet"
version="1">
<IPermission class="A.XPermission, CustomAttr,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=xxxxxxxxxxxx"
version="1"/>
</PermissionSet>
However, when I try to run the exe, I get:
Unhandled Exception: System.Security.SecurityException:
Failure decoding embedded permission set object.
at CustomAttrTester.Class1.Main(String[] args) in
C:\CustomAttrTester\class1.cs:line 16
Also, my WriteLines in the Permission class etc never get
printed on the command line!
Any help appreciated!
Vijay
------------custom attribute/permission implementation-----
using System.Security.Permissions;
using System.Security;
using System.Reflection;
using System;
namespace A {
[AttributeUsage(System.AttributeTargets.Method,
AllowMultiple=false, Inherited=false)]
[Serializable]
public sealed class XPermissionAttribute :
CodeAccessSecurityAttribute {
public XPermissionAttribute (SecurityAction action):
base(action) {
Console.WriteLine("Constructing attr");
}
public override IPermission CreatePermission() {
Console.WriteLine("Creating new XPermission");
return new XPermission();
}
}
[Serializable]
public sealed class XPermission : CodeAccessPermission {
public XPermission() {
Console.WriteLine("Constructing XPermission");
}
public override IPermission Copy() {
return new XPermission();
}
public override void FromXml(SecurityElement elem) {
Console.WriteLine(elem);
}
public override SecurityElement ToXml() {
SecurityElement elem = new SecurityElement
("IPermission");
String name = typeof
(XPermission).AssemblyQualifiedName;
elem.AddAttribute("class", name);
elem.AddAttribute("version", "1");
return elem;
}
public override IPermission Intersect(IPermission
permission) {
if (permission == null) {
return null;
}
if (permission is XPermission) {
return Copy();
}
return null;
}
public override IPermission Union(IPermission
permission) {
if (permission == null) {
return null;
}
if (permission is XPermission) {
return Copy();
}
return null;
}
public override bool IsSubsetOf(IPermission
permission) {
if (permission is XPermission) {
return true;
}
return false;
}
}
} |