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 машины.