1

Reporting Service 2008 内で配信拡張機能を実行しています。

久々に元気に走っています。しかし今、拡張機能内からデータベースに挿入したいと考えています。

私が得た最初のエラーはこれでした:

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.PermissionSet.Demand()
   at System.Data.Common.DbConnectionOptions.DemandPermission()
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()

次に、接続を開いて挿入を行うコードの前に、これを追加しました。

SqlClientPermission sqlPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
sqlPermission.Assert();

その後、エラー メッセージは次のように変わりました。

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
   at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

次に、次の行を追加しました。

SecurityPermission permission = new SecurityPermission(PermissionState.Unrestricted);
permission.Assert();

そして今、私が得るエラーはこれです:

Exception: System.Security.SecurityException Exception Message: Stack walk modifier must be reverted before another modification of the same type can be performed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

実際の SqlConnection 固有のコードを含む私のコードは、Delivery Extension から参照されるアセンブリにあります。アクセス許可固有のコードはそのアセンブリ内にありましたが、それを Delivery Extension アセンブリに移動しようとしましたが、うまくいきませんでした。

4

2 に答える 2

1

user407428 は正しいです。2 つの異なる修飾子を有効にしようとすると、問題が発生します。最善の原則は、パーミッションを必要とするコードの部分に対してパーミッションを許可し、後でパーミッションを無効にすることです。そのため、次のアクセス許可が必要になったときに、それらの権利を再度変更できます。

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

   //<your code that requires SqlClientPermission here>

CodeAccessPermission.RevertAccess();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

考慮すべきその他の事項として、オブジェクトをスタック ウォークに保持する必要はほとんどないため、アサートは ei という 1 行に簡略化できます。

System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

カプセル化メソッドでスタック ウォークを変更した場合、内部スタックはおそらく修飾子を再度変更できなくなります。元。

public void UseSecurityPermission()
{
    CodeAccessPermission.RevertAssert();
    new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

    <Some code that requires the SecurityPermission>
}

static void Main(string[] args)
{
    new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
    //< Some code that requires IOPermission>
    UseSecurityPermission();
}   

UseSecurityPermission() はスタック ウォークのアクセス許可を元に戻しますが、コンパイラはコンテキストでセキュリティ記述子を取得できないため、機能しません。

さらに読む: Stack-Walk Modifiers を使用したプログラミング

于 2017-01-10T07:27:19.173 に答える
0

アクセス許可を変更しようとしている時点で、すでに上位レベルから継承している可能性があります。

たとえば、次のようなコードがあります。

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

あなたのような例外があります。

于 2010-07-31T11:36:37.937 に答える