8

SSRS プロジェクトのカスタム アセンブリを作成しました。

カスタム アセンブリには次の 2 つの機能がIsInGroupありMyTestます。

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Principal;

namespace SSRS_Custom_Fuctions
{
    public class Class1
    {

        public static bool IsInGroup(string user, string group)
        {
            using (var identity = new WindowsIdentity(user))
            {
                var principal = new WindowsPrincipal(identity);
                return principal.IsInRole(group);
            }
        }

        public static string MyTest()
        {
            return "Hello World";
        }
    }
}

MyTest1)文字列 'Hello World' を返す基本関数は、次の式を使用してレポートから完全に正常に動作します。=SSRS_Custom_Functions.Class1.MyTest()

2)IsInGroupブール値を返す関数が機能していません。これはSystem.Security.Principal名前空間を使用して、関数に渡されたユーザー名が関数に渡されたグループに存在するかどうかを確認しています。expression を使用して呼び出そうとすると=SSRS_Custom_Functions.Class1.IsInGroup(User.User1, "MyGroupName")、レポートは次のエラー メッセージで救済されます。

タイプ System.Security のアクセス許可の要求が失敗しました

Microsoft KB920769に従ってrssrvpolicy.config、ReportingServices ファイル パスとVisualStudio ファイル パスの構成ファイルを変更しました。RSPreviewPolicy.config

カスタムアセンブリCodeGroupに与えるを追加しました。FullTrust

ポリシー レベル要素に以下が追加されました。

<CodeGroup class="UnionCodeGroup"
           version="1"
           PermissionSetName="FullTrust"
           Name="SSRS_Custom_Fuctions"
           Description="Code group for my data processing extension">

<IMembershipCondition class="UrlMembershipCondition"
                      version="1"
                      Url="C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\SSRS_Custom_Fuctions.dll"/>
</CodeGroup>

上記と同じエラーメッセージが引き続き表示されます。

4

2 に答える 2

4

アセンブリでは、使用する前に SecurityPermission オブジェクトをアサートする必要があります。

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Principal;

namespace SSRS_Custom_Fuctions
{
    public class Class1
    {

        public static bool IsInGroup(string user, string group)
        {

        System.Security.Permissions.SecurityPermission sp = new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted);
        sp.Assert();

            using (var identity = new WindowsIdentity(user))
            {
                var principal = new WindowsPrincipal(identity);
                return principal.IsInRole(group);
            }
        }

        public static string MyTest()
        {
            return "Hello World";
        }
    }
}
于 2012-08-03T14:03:29.067 に答える
1

AssemblyInfoファイルに追加する必要がありnamespace System.Securityます

[assembly: AllowPartiallyTrustedCallers()] .

証明書を使用してアセンブリに署名し、同じものをマシンのGACに展開します。

于 2012-08-04T20:19:04.020 に答える