Я хотел бы добавить базовую HTTP-авторизацию ко всему сайту, который использует аутентификацию форм для некоторых защищенных страниц.Идея состоит в том, чтобы представить клиенту этап разработки портала, чтобы он мог с ним поиграть, но чтобы обезопасить весь сайт с помощью дополнительных простых логина и пароля на уровне HTTP, чтобы никто другой не мог получить к нему доступ.Классического тега в web.config здесь недостаточно, поскольку портал может использовать аутентификацию форм (с регистрацией пользователя) как часть своей функциональности.Я хотел бы авторизовать пользователя по протоколу HTTP до проверки подлинности на основе форм, что может произойти позже.
Для авторизации на уровне HTTP должны быть настроены администратор (то есть в текстовом файле) логин и пароль.
Будетможно ли реализовать эту функцию с помощью пользовательского модуля http?
ОБНОВЛЕНИЕ:
Идея состоит в том, чтобы создать способ защиты приложения на уровне конфигурации.Аутентификация с помощью форм здесь не включена, потому что обработка разных типов учетных записей и ролей потребует изменений в приложении.
Я уже решил эту проблему с помощью простого пользовательского модуля, который проверяет заголовок авторизации HTTP и ответ с HTTP 401.модуль может быть подключен к любому веб-сайту через Web.Config
РЕШЕНИЕ:
Класс модуля:
public class BasicAuthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.HttpApplicationBeginRequest);
}
private void HttpApplicationBeginRequest(object sender, EventArgs e)
{
var request = HttpContext.Current.Request;
var response = HttpContext.Current.Response;
string authHeader = request.Headers["Authorization"];
if (string.IsNullOrEmpty(authHeader))
{
this.RequireAuthorization(response);
}
else
{
string authType = authHeader.Split(' ').First();
string authData = authHeader.Split(' ').Last();
if (authType.ToLower() == "basic")
{
byte[] bytes = Convert.FromBase64String(authData);
string plainText = Encoding.UTF8.GetString(bytes);
string login = plainText.Split(':').First();
string password = plainText.Split(':').Last();
if (!this.Validate(login, password))
{
this.DenyAccess(response);
}
}
else
{
this.DenyAccess(response);
}
}
}
private bool Validate(string login, string password)
{
return (login == ConfigurationManager.AppSettings["AuthLogin"]) && (password == ConfigurationManager.AppSettings["AuthPwd"]);
}
private void RequireAuthorization(HttpResponse response)
{
response.AddHeader("WWW-Authenticate", "Basic realm=\"stage\"");
response.StatusCode = 401;
response.Status = "401 Authorization Required";
response.ContentType = "text/html";
response.End();
}
private void DenyAccess(HttpResponse response)
{
response.AddHeader("WWW-Authenticate", "Basic realm=\"stage\"")
response.StatusCode = 401;
response.Status = "401 Authorization Required";
response.ContentType = "text/html";
response.End();
}
}
В web.config:
<modules runAllManagedModulesForAllRequests="true">
...
<add name="BasicAuthModule" type="MyNamespace.BasicAuthModule, MyNamespace.Module"/>
</modules>