Как использовать базовую авторизацию http вместе с аутентификацией форм в приложениях .net - PullRequest
4 голосов
/ 18 марта 2011

Я хотел бы добавить базовую 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>

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Конечно, это можно сделать с помощью пользовательского модуля.Вы можете (и я имею, по другим причинам) игнорировать концепции пользователей ASP.NET, и ваш модуль должен вернуть 401, который настаивает на входе в систему, или разрешить запрос продолжить, в зависимости от ситуации.RFC 2617 имеет все, что вам нужно знать об этом.Если вы игнорируете пользовательские объекты ASP.NET, тогда не будет никаких помех между стандартной аутентификацией и аутентификацией формы, которую ваше приложение уже использует.

Помните, что базовый легко перехватывается, если не через HTTPS, в этом случае выможет захотеть использовать дайджест вместо.Дайджест немного сложнее сделать самостоятельно, но, конечно, не очень сложно, и также документирован в RFC 2617.

1 голос
/ 18 марта 2011

это может быть то, что вы ищете:

http://msdn.microsoft.com/en-us/library/aa479391.aspx#madam_topic4

но в любом случае было бы проще покрыть все страницы логином и использовать только аутентификацию форм.

Вы также можете рассмотреть вопрос об использовании ролей, отключить анонимных пользователей, а затем создать одну роль для еще не зарегистрированных пользователей и другую роль для зарегистрированных пользователей.На последнем этапе вы просто отключаете первую роль и разрешаете анонимным пользователям

Вы даже можете устанавливать разные правила на уровне папок, это еще один способ пойти

0 голосов
/ 18 марта 2011

Почему бы не использовать проверку подлинности с помощью форм для всего сайта и добавить роль бета-тестеров для защищенной области и страниц?

...