SSRS проверить, если пользователь в группе, используя пользовательскую сборку

Я создал пользовательскую сборку для моего проекта 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) Основная функция MyTest который возвращает строку "Hello World" отлично работает из отчета, используя выражение =SSRS_Custom_Functions.Class1.MyTest()

2) функция IsInGroup который возвращает логическое значение не работает. Это с помощью System.Security.Principal пространство имен, чтобы проверить, существует ли имя пользователя, переданное функции, в группе, переданной функции. При попытке вызвать его с помощью выражения =SSRS_Custom_Functions.Class1.IsInGroup(User.User1, "MyGroupName")отчет отправляется со следующим сообщением об ошибке:

запрос на разрешение типа System.Security завершился неудачно

Я изменил файлы конфигурации rssrvpolicy.config в пути к файлу ReportingServices и RSPreviewPolicy.config в пути к файлу VisualStudio в соответствии с Microsoft KB920769.

Я добавил 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>

Я все еще получаю то же сообщение об ошибке, что и выше.

2 ответа

Решение

В вашей сборке вам необходимо сначала установить объект 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";
        }
    }
}

В файл AssemblyInfo нужно добавить namespace System.Security а также

[assembly: AllowPartiallyTrustedCallers()] .

Подписать сборку сертификатом, а также развернуть его в GAC машины.

Другие вопросы по тегам