CodeAccessPermission 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
注意
Code Access Security is not supported or honored by the runtime.
定义所有代码访问权限的基础结构。
public ref class CodeAccessPermission abstract : System::Security::IPermission, System::Security::IStackWalk
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Obsolete("Code Access Security is not supported or honored by the runtime.", DiagnosticId="SYSLIB0003", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Serializable]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Obsolete("Code Access Security is not supported or honored by the runtime.", DiagnosticId="SYSLIB0003", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Serializable>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
Public MustInherit Class CodeAccessPermission
Implements IPermission, IStackWalk
- 继承
-
CodeAccessPermission
- 派生
- 属性
- 实现
示例
下面的代码示例显示了派生自 CodeAccessPermission 类的权限。
//#define debug
// This custom permission is intended only for the purposes of illustration.
// The following code shows how to create a custom permission that inherits
// from CodeAccessPermission. The code implements all required overrides.
// A wildcard character ('*') is implemented for the Name property.
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::IO;
using namespace System::Security::Policy;
using namespace System::Collections;
using namespace System::Text;
[assembly:System::Reflection::AssemblyKeyFile("Key.snk")];
[assembly:System::Security::AllowPartiallyTrustedCallersAttribute];
[Serializable]
public ref class NameIdPermission: public CodeAccessPermission, public IUnrestrictedPermission
{
private:
String^ m_Name;
bool m_Unrestricted;
public:
NameIdPermission( String^ name )
{
m_Name = name;
}
NameIdPermission( PermissionState state )
{
if ( state == PermissionState::None )
{
m_Name = "";
}
else if ( state == PermissionState::Unrestricted )
{
throw gcnew ArgumentException( "Unrestricted state is not allowed for identity permissions." );
}
else
{
throw gcnew ArgumentException( "Invalid permission state." );
}
}
property String^ Name
{
String^ get()
{
return m_Name;
}
void set( String^ value )
{
m_Name = value;
}
}
public:
virtual IPermission^ Copy() override
{
String^ name = m_Name;
return gcnew NameIdPermission( name );
}
public:
virtual bool IsUnrestricted()
{
// Always false, unrestricted state is not allowed.
return m_Unrestricted;
}
private:
bool VerifyType( IPermission^ target )
{
return dynamic_cast<NameIdPermission^>(target) != nullptr;
}
public:
virtual bool IsSubsetOf( IPermission^ target ) override
{
#if ( debug )
Console::WriteLine( "************* Entering IsSubsetOf *********************" );
#endif
if ( target == nullptr )
{
Console::WriteLine( "IsSubsetOf: target == null" );
return false;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
try
{
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
// The following check for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if ( true == operand->m_Unrestricted )
{
return true;
}
else if ( true == this->m_Unrestricted )
{
return false;
}
if ( this->m_Name != nullptr )
{
if ( operand->m_Name == nullptr )
{
return false;
}
if ( this->m_Name->Equals( "" ) )
{
return true;
}
}
if ( this->m_Name->Equals( operand->m_Name ) )
{
return true;
}
else
{
// Check for wild card character '*'.
int i = operand->m_Name->LastIndexOf( "*" );
if ( i > 0 )
{
String^ prefix = operand->m_Name->Substring( 0, i );
if ( this->m_Name->StartsWith( prefix ) )
{
return true;
}
}
}
return false;
}
catch ( InvalidCastException^ )
{
throw gcnew ArgumentException( String::Format( "Argument_WrongType", this->GetType()->FullName ) );
}
}
public:
virtual IPermission^ Intersect( IPermission^ target ) override
{
Console::WriteLine( "************* Entering Intersect *********************" );
if ( target == nullptr )
{
return nullptr;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
if ( !VerifyType( target ) )
{
throw gcnew ArgumentException( String::Format( "Argument is wrong type.", this->GetType()->FullName ) );
}
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
if ( operand->IsSubsetOf( this ) )
{
return operand->Copy();
}
else if ( this->IsSubsetOf( operand ) )
{
return this->Copy();
}
else
{
return nullptr;
}
}
public:
virtual IPermission^ Union( IPermission^ target ) override
{
#if ( debug )
Console::WriteLine( "************* Entering Union *********************" );
#endif
if ( target == nullptr )
{
return this;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
if ( !VerifyType( target ) )
{
throw gcnew ArgumentException( String::Format( "Argument_WrongType", this->GetType()->FullName ) );
}
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
if ( operand->IsSubsetOf( this ) )
{
return this->Copy();
}
else if ( this->IsSubsetOf( operand ) )
{
return operand->Copy();
}
else
{
return nullptr;
}
}
public:
virtual void FromXml( SecurityElement^ e ) override
{
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
String^ elUnrestricted = e->Attribute("Unrestricted");
if ( nullptr != elUnrestricted )
{
m_Unrestricted = Boolean::Parse( elUnrestricted );
return;
}
String^ elName = e->Attribute("Name");
m_Name = elName == nullptr ? nullptr : elName;
}
public:
virtual SecurityElement^ ToXml() override
{
// Use the SecurityElement class to encode the permission to XML.
SecurityElement^ esd = gcnew SecurityElement( "IPermission" );
String^ name = NameIdPermission::typeid->AssemblyQualifiedName;
esd->AddAttribute( "class", name );
esd->AddAttribute( "version", "1.0" );
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if ( m_Unrestricted )
{
esd->AddAttribute( "Unrestricted", true.ToString() );
}
if ( m_Name != nullptr )
{
esd->AddAttribute( "Name", m_Name );
}
return esd;
}
};
//#define debug
// This custom permission is intended only for the purposes of illustration.
// The following code shows how to create a custom permission that inherits
// from CodeAccessPermission. The code implements all required overrides.
// A wildcard character ('*') is implemented for the Name property.
using System;
using System.Security;
using System.Security.Permissions;
using System.IO;
using System.Security.Policy;
using System.Collections;
using System.Text;
[assembly:System.Reflection.AssemblyKeyFile("Key.snk")]
[assembly:System.Security.AllowPartiallyTrustedCallersAttribute()]
namespace MyPermission
{
[Serializable()] sealed public class NameIdPermission : CodeAccessPermission, IUnrestrictedPermission
{
private String m_Name;
private bool m_Unrestricted;
public NameIdPermission(String name)
{
m_Name = name;
}
public NameIdPermission(PermissionState state)
{
if (state == PermissionState.None)
{
m_Name = "";
}
else
if (state == PermissionState.Unrestricted)
{
throw new ArgumentException("Unrestricted state is not allowed for identity permissions.");
}
else
{
throw new ArgumentException("Invalid permission state.");
}
}
public String Name
{
set{m_Name = value;}
get{ return m_Name;}
}
public override IPermission Copy()
{
string name = m_Name;
return new NameIdPermission( name );
}
public bool IsUnrestricted()
{
// Always false, unrestricted state is not allowed.
return m_Unrestricted;
}
private bool VerifyType(IPermission target)
{
return (target is NameIdPermission);
}
public override bool IsSubsetOf(IPermission target)
{
#if(debug)
Console.WriteLine ("************* Entering IsSubsetOf *********************");
#endif
if (target == null)
{
Console.WriteLine ("IsSubsetOf: target == null");
return false;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
try
{
NameIdPermission operand = ( NameIdPermission)target;
// The following check for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if (true == operand.m_Unrestricted)
{
return true;
}
else if (true == this.m_Unrestricted)
{
return false;
}
if (this.m_Name != null)
{
if (operand.m_Name == null) return false;
if (this.m_Name == "") return true;
}
if (this.m_Name.Equals (operand.m_Name))
{
return true;
}
else
{
// Check for wild card character '*'.
int i = operand.m_Name.LastIndexOf ("*");
if (i > 0)
{
string prefix = operand.m_Name.Substring (0, i);
if (this.m_Name.StartsWith (prefix))
{
return true;
}
}
}
return false;
}
catch (InvalidCastException)
{
throw new ArgumentException (String.Format ("Argument_WrongType", this.GetType ().FullName));
}
}
public override IPermission Intersect(IPermission target)
{
Console.WriteLine ("************* Entering Intersect *********************");
if (target == null)
{
return null;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
if (!VerifyType(target))
{
throw new ArgumentException (String.Format ("Argument is wrong type.", this.GetType ().FullName));
}
NameIdPermission operand = ( NameIdPermission)target;
if (operand.IsSubsetOf (this)) return operand.Copy ();
else if (this.IsSubsetOf (operand)) return this.Copy ();
else
return null;
}
public override IPermission Union(IPermission target)
{
#if(debug)
Console.WriteLine ("************* Entering Union *********************");
#endif
if (target == null)
{
return this;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
if (!VerifyType(target))
{
throw new ArgumentException (String.Format ("Argument_WrongType", this.GetType ().FullName));
}
NameIdPermission operand = ( NameIdPermission)target;
if (operand.IsSubsetOf (this)) return this.Copy ();
else if (this.IsSubsetOf (operand)) return operand.Copy ();
else
return null;
}
public override void FromXml(SecurityElement e)
{
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
String elUnrestricted = e.Attribute("Unrestricted");
if (null != elUnrestricted)
{
m_Unrestricted = bool.Parse(elUnrestricted);
return;
}
String elName = e.Attribute( "Name" );
m_Name = elName == null ? null : elName;
}
public override SecurityElement ToXml()
{
// Use the SecurityElement class to encode the permission to XML.
SecurityElement esd = new SecurityElement("IPermission");
String name = typeof( NameIdPermission).AssemblyQualifiedName;
esd.AddAttribute("class", name);
esd.AddAttribute("version", "1.0");
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if (m_Unrestricted)
{
esd.AddAttribute("Unrestricted", true.ToString());
}
if (m_Name != null) esd.AddAttribute( "Name", m_Name );
return esd;
}
}
}
' This custom permission is intended only for the purposes of illustration.
' The following code shows how to create a custom permission that inherits
' from CodeAccessPermission. The code implements all required overrides.
' A wildcard character ('*') is implemented for the Name property.
Imports System.Security
Imports System.Security.Permissions
Imports System.IO
Imports System.Security.Policy
Imports System.Collections
<assembly: System.Reflection.AssemblyKeyFile("Key.snk")>
<assembly: System.Security.AllowPartiallyTrustedCallersAttribute()>
Namespace MyPermission
<Serializable()> _
Public NotInheritable Class NameIdPermission
Inherits CodeAccessPermission
Implements IUnrestrictedPermission
Private m_Name As String
Private m_Unrestricted As Boolean
Public Sub New(ByVal name As String)
m_name = name
End Sub
Public Sub New(ByVal state As PermissionState)
If state = PermissionState.None Then
m_name = ""
ElseIf state = PermissionState.Unrestricted Then
Throw New ArgumentException("Unrestricted state is not allowed for identity permissions.")
Else
Throw New ArgumentException("Invalid permission state.")
End If
End Sub
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
Public Overrides Function Copy() As IPermission
Dim name As String
name = m_name
Return New NameIdPermission(name)
End Function 'Copy
Public Function IsUnrestricted() As Boolean Implements IUnrestrictedPermission.IsUnrestricted
' Always false, unrestricted state is not allowed.
Return m_Unrestricted
End Function
Private Function VerifyType(ByVal target As IPermission) As Boolean
Return TypeOf target Is NameIdPermission
End Function 'VerifyType
Public Overrides Function IsSubsetOf(ByVal target As IPermission) As Boolean
#If (Debug) Then
Console.WriteLine("************* Entering IsSubsetOf *********************")
#End If
If target Is Nothing Then
Console.WriteLine("IsSubsetOf: target == null")
Return False
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
Try
Dim operand As NameIdPermission = CType(target, NameIdPermission)
' The following check for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
If True = operand.m_Unrestricted Then
Return True
ElseIf True = Me.m_Unrestricted Then
Return False
End If
If Not (Me.m_name Is Nothing) Then
If operand.m_name Is Nothing Then
Return False
End If
If Me.m_name = "" Then
Return True
End If
End If
If Me.m_name.Equals(operand.m_name) Then
Return True
Else
' Check for wild card character '*'.
Dim i As Integer = operand.m_name.LastIndexOf("*")
If i > 0 Then
Dim prefix As String = operand.m_name.Substring(0, i)
If Me.m_name.StartsWith(prefix) Then
Return True
End If
End If
End If
Return False
Catch
Throw New ArgumentException(String.Format("Argument_WrongType", Me.GetType().FullName))
End Try
End Function
Public Overrides Function Intersect(ByVal target As IPermission) As IPermission
Console.WriteLine("************* Entering Intersect *********************")
If target Is Nothing Then
Return Nothing
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
If Not VerifyType(target) Then
Throw New ArgumentException(String.Format("Argument is wrong type.", Me.GetType().FullName))
End If
Dim operand As NameIdPermission = CType(target, NameIdPermission)
If operand.IsSubsetOf(Me) Then
Return operand.Copy()
ElseIf Me.IsSubsetOf(operand) Then
Return Me.Copy()
Else
Return Nothing
End If
End Function 'Intersect
Public Overrides Function Union(ByVal target As IPermission) As IPermission
#If (Debug) Then
Console.WriteLine("************* Entering Union *********************")
#End If
If target Is Nothing Then
Return Me
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
If Not VerifyType(target) Then
Throw New ArgumentException(String.Format("Argument_WrongType", Me.GetType().FullName))
End If
Dim operand As NameIdPermission = CType(target, NameIdPermission)
If operand.IsSubsetOf(Me) Then
Return Me.Copy()
ElseIf Me.IsSubsetOf(operand) Then
Return operand.Copy()
Else
Return Nothing
End If
End Function 'Union
Public Overrides Sub FromXml(ByVal e As SecurityElement)
' The following code for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
Dim elUnrestricted As String = e.Attribute("Unrestricted")
If Nothing <> elUnrestricted Then
m_Unrestricted = Boolean.Parse(elUnrestricted)
Return
End If
Dim elName As String = e.Attribute("Name")
m_name = IIf(elName Is Nothing, Nothing, elName)
End Sub
Public Overrides Function ToXml() As SecurityElement
' Use the SecurityElement class to encode the permission to XML.
Dim esd As New SecurityElement("IPermission")
Dim name As String = GetType(NameIdPermission).AssemblyQualifiedName
esd.AddAttribute("class", name)
esd.AddAttribute("version", "1.0")
' The following code for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
If m_Unrestricted Then
esd.AddAttribute("Unrestricted", True.ToString())
End If
If Not (m_Name Is Nothing) Then
esd.AddAttribute("Name", m_Name)
End If
Return esd
End Function 'ToXml
End Class
End Namespace
注解
注意
代码访问安全性 (CAS) 已在所有版本的 .NET Framework 和 .NET 中弃用。 如果使用与 CAS 相关的 API,最新版本的 .NET 不会遵循 CAS 注释,并会生成错误。 开发人员应寻求用于完成安全任务的替代方法。
代码访问权限使用堆栈遍历来确保向代码的所有调用方授予权限。 如果权限对象为 null
,则其处理方式与状态 PermissionState.None为 的权限对象相同。
调用堆栈通常表示为向下增长,因此调用堆栈中较高方法调用调用堆栈中较低的方法。
必须向 类的 CodeAccessPermission 继承者授予完全信任,才能作为扩展安全基础结构的权限正常运行。 若要确定继承者是完全受信任的,CodeAccessPermission请为 ControlEvidencetrue
= 和 ControlPolicytrue
= 发出 。InheritanceDemand
实施者说明
从 CodeAccessPermission继承时,还必须实现 IUnrestrictedPermission 接口。
必须重写以下CodeAccessPermission成员:Copy()、、Intersect(IPermission)、IsSubsetOf(IPermission)ToXml()、 FromXml(SecurityElement)和 Union(IPermission)。
还必须定义采用 作为其唯一参数的构造函数 PermissionState 。
必须将 特性 SerializableAttribute 应用于继承自 CodeAccessPermission的类。
构造函数
CodeAccessPermission() |
已过时.
初始化 CodeAccessPermission 类的新实例。 |
方法
Assert() |
已过时.
声明调用代码能够通过调用此方法的代码,访问受权限请求保护的资源,即使未对堆栈中处于较高位置的调用方授予访问该资源的权限。 使用 Assert() 会引起安全问题。 |
Copy() |
已过时.
由派生类实现时,创建并返回当前权限对象的相同副本。 |
Demand() |
已过时.
如果未对调用堆栈中处于较高位置的所有调用方授予当前实例所指定的权限,则在运行时强制 SecurityException。 |
Deny() |
已过时.
已过时.
防止处于调用堆栈较高位置的调用函数使用可以调用此方法来访问当前实例指定资源的代码。 |
Equals(Object) |
已过时.
确定指定的 CodeAccessPermission 对象是否等于当前的 CodeAccessPermission。 |
Equals(Object) |
已过时.
确定指定对象是否等于当前对象。 (继承自 Object) |
FromXml(SecurityElement) |
已过时.
当在派生类中替代时,用 XML 编码重新构造具有指定状态的安全对象。 |
GetHashCode() |
已过时.
获取 CodeAccessPermission 对象的哈希代码,此代码适合在哈希算法和数据结构(例如哈希表)中使用。 |
GetHashCode() |
已过时.
作为默认哈希函数。 (继承自 Object) |
GetType() |
已过时.
获取当前实例的 Type。 (继承自 Object) |
Intersect(IPermission) |
已过时.
通过派生类实现时,创建和返回是当前权限和指定权限的交集的权限。 |
IsSubsetOf(IPermission) |
已过时.
通过派生类实现时,确定当前权限是否为指定权限的子集。 |
MemberwiseClone() |
已过时.
创建当前 Object 的浅表副本。 (继承自 Object) |
PermitOnly() |
已过时.
防止处于调用堆栈较高位置的调用函数使用此代码,此代码将调用此方法来访问除当前实例指定的资源以外的所有资源。 |
RevertAll() |
已过时.
导致当前帧以前所有的重写被删除且不再有效。 |
RevertAssert() |
已过时.
导致当前帧以前所有的 Assert() 被删除且不再有效。 |
RevertDeny() |
已过时.
已过时.
导致当前帧以前所有的 Deny() 被删除且不再有效。 |
RevertPermitOnly() |
已过时.
导致当前帧以前所有的 PermitOnly() 被删除且不再有效。 |
ToString() |
已过时.
创建并返回当前权限对象的字符串表示形式。 |
ToXml() |
已过时.
当在派生类中重写时,创建安全对象及其当前状态的 XML 编码。 |
Union(IPermission) |
已过时.
当在派生类中重写时,则创建属于当前权限与指定权限的并集的权限。 |