Константин Косинский
Иногда возникает потребность обеспечить для своих отчетов доступ с вводом логина и пароля в через Web-форму, например, для встраивания в не Microsoft-решения. А так как SSRS является обычным ASP.NET приложением, то возникает идея применить обычную Forms Authentication. Из коробки система делать это не умеет, и нужно разработать небольшое расширение. К счастью, на Codeplex уже есть готовая наработка, которую нужно просто скомпилировать и правильно настроить.
По умолчанию примеры будут лежать в папке <system_drive>:\Program Files\Microsoft SQL Server\100\Samples
- Запускаем командную строку Visual Studio и в папке с примерами выполняем команду
sn -k SampleKey.snk
- Открываем в Visual Studio 2005 или выше проект CustomSecurity из папки Reporting Services\Extensions (не забудьте про UAC, т.к. компиляция в папке по умолчанию требует админских прав)
- Добавляем Reference на библиотеку Microsoft.ReportingServices.Interfaces, которая лежит в подпапке ReportServer\bin инсталяции Reporting Services (у меня это C:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services)
- После этого про собираем приложение
- Дальше копируюем только что скомпилированную библиотеку Microsoft.Samples.ReportingServices.CustomSecurity.dll в папки <install>\ReportServer\bin и <install>\ReportManager\bin
- Файл Logon.aspx в <install>\ReportServer, а UILogon.aspx в <install>\ReportManager\Pages
- Редактируем файл RSReportServer.config из папки <install>\ReportServer:
- Содержимое секции AuthenticationTypes заменяем на <Custom/>
- В подсекцию <Security> секции <Extensions> добавляем:
<Extension Name="Forms" Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization,
Microsoft.Samples.ReportingServices.CustomSecurity" >
<Configuration>
<AdminConfiguration>
<UserName>username</UserName>
</AdminConfiguration>
</Configuration>
</Extension>
- В подсекцию <Authentication> секции <Extensions> добавляем:
<Extension Name="Forms" Type="Microsoft.Samples.ReportingServices.CustomSecurity.AuthenticationExtension,
Microsoft.Samples.ReportingServices.CustomSecurity" />
<CustomAuthenticationUI>
<loginUrl>/Pages/UILogon.aspx</loginUrl>
<UseSSL>False</UseSSL>
</CustomAuthenticationUI>
- Редактируем файл RSSrvPolicy.config из папки <install>\ReportServer, добавляем в него:
<CodeGroup
class="UnionCodeGroup"
version="1"
Name="SecurityExtensionCodeGroup"
Description="Code group for the sample security extension"
PermissionSetName="FullTrust">
<IMembershipCondition
class="UrlMembershipCondition"
version="1"
Url="путь к библиотеке Microsoft.Samples.ReportingServices.CustomSecurity.dll"
/>
</CodeGroup>
- Редактируем файл RSMgrPolicy.config из папки <install>\ReportManager, у CodeGroup для MyComputer свойство PermissionSetName делаем равным FullTrust
- Редактируем файл Web.config из папки <install>\ReportServer. Заменяем конструкцию:
<authentication mode="Windows" />
<identity impersonate="true" />
на
<authentication mode="Forms" >
<forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/"></forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
<identity impersonate="false" />
- Редактируем файл Web.config из папки <install>\ReportManager.
<identity impersonate="true" />
на
<identity impersonate="false" />
Настройка аутентификации должна остаться Windows
<add key="ReportServer" value="имя сервера"/>
<add key="ReportServerInstance" value="RS_MSSQLSERVER"/>
Имя экземпляра SSRS может быть другм проще всего его выяснить выполнив следующую PowerShell команду:
get-wmiobject -namespace "root\Microsoft\SqlServer\ReportServer" -class "__Namespace" / Select Name
- Выполняем скрипт Createuserstore.SQL из папки C:\Program Files\Microsoft SQL Server\100\Samples\Reporting Services\Extension Samples\FormsAuthentication Sample\cs\FormsAuthentication
- Все практически готово. Заходим браузером на Web Service URL вашего SSRS и видим следующую картину:
- Создаем нового юзера при помощи кнопки Register User. Он будет добавлен в таблицу Users созданной два шага назад базы данных. После этого нажимаем Logon И получаем сообщению, что у нашего юзера не хватает прав:
- Снова редактируем файл RSReportServer.config из папки <install>\ReportServer в ранее добавленном блоке меняем имя пользователя:
<Extension Name="Forms" Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization,
Microsoft.Samples.ReportingServices.CustomSecurity" >
<Configuration>
<AdminConfiguration>
<UserName>Имя пользователя</UserName>
</AdminConfiguration>
</Configuration>
</Extension>
- После этого перезапускаем сервис Reporting Services и обновляем страницу. Пользователь получает админский доступ к Reporting Services.
Для того чтобы настроить права для других пользователей можно воспользоваться стандартным интерфейсом Report Manager"а (пользователей сначала нужно завести в базу аккаунтов). Связывание производится просто по имени.
Запись в базе UserAccounts:
Настройка прав:
После этого можно отредактировать внешний вид страниц входа в систему (по крайней мере, убрать кнопку регистрации).