*Подробности среды описаны внизу.
Я пытаюсь создать решение для проверки подлинности для служб отчетов.
Интернет-клиенты должны аутентифицироваться с использованием нашей существующей базы данных клиентов, в то время как локальные пользователи с правами администратора могут использовать простую, базовую аутентификацию.
Я сделал расширение безопасности для 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-адресу, развертывание отчета о ставках, а не обычные пользовательские приложения) подвергается сомнению с помощью всплывающего окна с базовым входом/паролем. Для поддержки этого я сделал 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: Неавторизованный
Я хочу знать, как я могу передать вызов входа/пароля вплоть до /Reports
Я использую SqlServer 2012 вместе со службами Reporting Services 2012, но внутренняя работа не изменилась из SSRS 2008-R2
В моем web.config
у меня есть
<authentication mode="None" />
<identity impersonate="false" />, and the entry for the httpmodule
On rssrvpolicy.config
кодовая группа для моего httpmodule с FullTrust
На rsreportserver.config
У меня есть
<AuthenticationTypes>
<Custom/>
</AuthenticationTypes>, and the entry for the security extension
У меня еще не настроен SSL
, и привязки по умолчанию