SQL Server Reporting Services и Forms Authentication

Источник: net
Константин Косинский

Иногда возникает потребность обеспечить для своих отчетов доступ с вводом логина и пароля в через Web-форму, например, для встраивания в не Microsoft-решения. А так как SSRS является обычным ASP.NET приложением, то возникает идея применить обычную Forms Authentication. Из коробки система делать это не умеет, и нужно разработать небольшое расширение. К счастью, на Codeplex уже есть готовая наработка, которую нужно просто скомпилировать и правильно настроить.

  • Скачиваем и устанавливаем примеры для SSRS. Лежат они здесь (обратите внимание на битность, я проводил эксперимент на Windows 7 x64, по этому качал SQL2008.Reporting_Services.Samples.x64.msi). Детальная документация по установке находится здесь.

По умолчанию примеры будут лежать в папке <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" />
    • В секцию <UI> добавляем:
<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:

Настройка прав:

После этого можно отредактировать внешний вид страниц входа в систему (по крайней мере, убрать кнопку регистрации).


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22043