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";
        }
    }
}

1) 返回字符串“Hello World”的基本函数MyTest使用表达式从报告中完美运行=SSRS_Custom_Functions.Class1.MyTest()

2)IsInGroup返回布尔值的函数不起作用。这是使用System.Security.Principal命名空间来检查传递给函数的用户名是否存在于传递给函数的组中。当尝试使用 expression 调用它时=SSRS_Custom_Functions.Class1.IsInGroup(User.User1, "MyGroupName"),报告会出现以下错误消息:

请求 System.Security 类型的权限失败

我已经根据Microsoft KB920769rssrvpolicy.config修改了 ReportingServices 文件路径和VisualStudio 文件路径中的配置文件。RSPreviewPolicy.config

我添加了一个CodeGroupFullTrust我的自定义程序集。

以下内容已添加到策略级别元素中:

<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 回答