Подтвердить что ты не робот

Как перенаправить основной запрос проверки подлинности на адрес менеджера отчетов

* Подробная информация об окружающей среде описана внизу.

Я пытаюсь создать решение для проверки подлинности для служб отчетов.

Онлайн-клиенты должны быть аутентифицированы с использованием нашей существующей базы данных клиентов, в то время как локальные административные пользователи могут использовать простую базовую аутентификацию.

Я сделал расширение безопасности для SSRS, используя примеры codeplex, и способ, которым я использую, чтобы выполнить основную задачу, выглядит следующим образом

public void GetUserInfo(out IIdentity userIdentity, out IntPtr userId)
{
    if (HttpContext.Current != null && HttpContext.Current.User != null)
        userIdentity = HttpContext.Current.User.Identity;
    else
    {
        HttpContext.Current.Response
            .AddHeader("WWW-Authenticate", "Basic realm=\"ReportServer\"");
        HttpContext.Current.Response.Status = "401 Unauthorized";
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.Close();
        userIdentity = new GenericIdentity("not authorized");
    }

    userId = IntPtr.Zero;
}

Таким образом, когда пользователь, который не прошел через метод LogonUser (т.е. прямой доступ к URL-адресу, развертывание отчетов о ставках, а не обычные пользовательские приложения), получает вызов с помощью всплывающего окна Basic logon/password. Чтобы поддержать это, я сделал httpmodule следующим образом

void IHttpModule.Init(HttpApplication context)
{
    context.AuthenticateRequest += CustomAuthenticateRequest;
}

void CustomAuthenticateRequest(object sender, EventArgs e)
{
    var app = sender as HttpApplication;

    if (app == null) return;

    var basicAuth = app.Context.Request.Headers["Authorization"];

    if (!string.IsNullOrEmpty(basicAuth))
    {
        var loginpass = Encoding.Default.GetString(
           Convert.FromBase64String(basicAuth.Replace("Basic ", ""))).Split(':');
        if (loginpass.Length == 2 
            && loginpass[0] == adminUser 
            && loginpass[1] == adminPass)
        {
            app.Context.User = new GenericPrincipal(
                new GenericIdentity(adminUser), null);
        }
    }
}

Это отлично работает при доступе к URL /ReportServer, мне бросают вызов, вводят жестко закодированный логин/пароль администратора и регистрируются.

Проблема в том, что при доступе к /Reports я получаю

System.Net.WebException: сбой запроса с состоянием HTTP 401: Несанкционированное

Я хочу знать, как я могу пройти вызов login/pass до конца до /Reports

Я запускаю SqlServer 2012 вместе с Reporting Services 2012, но внутренняя работа не изменилась с SSRS 2008-R2

В моем web.config у меня

<authentication mode="None" />
<identity impersonate="false" />, and the entry for the httpmodule

В rssrvpolicy.config codegroup для моего httpmodule с FullTrust

В rsreportserver.config у меня есть

    <AuthenticationTypes>
        <Custom/>
    </AuthenticationTypes>, and the entry for the security extension

У меня еще нет SSL, а привязки по умолчанию

4b9b3361

Ответ 1

Из сообщения об ошибке кажется, что ошибка аутентификации возникает при визуализации пользовательского интерфейса диспетчера отчетов. Перейдите в папку c:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportManager\и найдите файл web.config и примените следующие изменения.

<authentication mode="None" />
<identity impersonate="false" />, and the entry for the httpmodule