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

ASP.Net - использование базовой проверки подлинности без использования пользователей Windows

У нас есть веб-приложение ASP.Net, работающее на IIS6, которое управляет собственной базой данных пользователей.

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

У нас есть страница, содержащая таблицу данных HTML, которую мы импортируем в Excel, и затем используется для целей отчетности. Страница в настоящее время не имеет безопасности.

Нам нужно добавить безопасность на эту страницу, чтобы эти таблицы попадали в чужие руки, тогда данные не могут быть "Обновлены" без предоставления имени пользователя/пароля.

Если я установил эту страницу, чтобы не разрешать доступ к Anonymouse, я могу использовать аутентификацию Basic/Windows с пользователями Windows, чтобы защитить эту страницу. Затем, когда Excel обновляет данные, открывается диалоговое окно пароля.

Проблема в том, что мне нужно иметь возможность защищать эту страницу на основе пользователей в нашей базе данных, и они не будут пользователями Windows. Я также должен сделать это таким образом, чтобы Excel мог управлять аутентификацией, исключающей аутентификацию на основе форм.

У кого-нибудь есть идеи? Можно ли заставить IIS искать в другом месте для нее базовую аутентификацию?

4b9b3361

Ответ 1

Хорошо, поэтому я нашел два решения этой проблемы. Один из них благодаря ответу Zhaph - Ben Duguid, который является HttpModule, который позволяет ASP.Net полностью управлять аутентификацией.

Второе решение, и тот, с которым я иду, - благодаря этому вопросу/ответу.

HTTP-аутентификация (Basic или Digest) в ASP Classic через IIS

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

using System;
using System.Text;

namespace AuthenticationTests
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string authorisationHeader = Request.ServerVariables["HTTP_AUTHORIZATION"];

            if (authorisationHeader != null && authorisationHeader.StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))
            {
                string authorizationParameters = Encoding.Default.GetString(Convert.FromBase64String(authorisationHeader.Substring("Basic ".Length)));
                string userName = authorizationParameters.Split(':')[0];
                string password = authorizationParameters.Split(':')[1];

                if (userName == password) //Perform your actual "login" check here.
                {
                    //Authorised!
                    //Page loads as normal.
                }
                else
                {
                    Unauthorised();
                }
            }
            else
            {
                Unauthorised();
            }
        }

        private void Unauthorised()
        {
            Response.AddHeader("WWW-Authenticate", "Basic");
            Response.Status = "401 Unauthorized";
            Response.End();
        }
    }
}

Ответ 2

Поскольку у вас есть пользовательская база данных пользователей, я бы порекомендовал вам создать быстрый поставщик членства, который будет ссылаться на вашу схему базы данных,

MSDN имеет хороший пример в "Как: Пример поставщика членства" .

Затем вы можете использовать стандартные механизмы контроля доступа ASP.NET, чтобы заблокировать страницу, потребовать аутентификации и т.д., а также элементы управления, такие как Login, LoginStatus и другие, чтобы обеспечить много от пользовательского интерфейса, который вам нужен.


Изменить для добавления

Быстрый search нашел следующее, что могло бы помочь:

Безопасность веб-сервиса - базовая аутентификация HTTP без Active Directory

Где Грег Рейнакер представляет "полностью рабочий образец в 100% управляемом коде, демонстрирующем использование аутентификации HTTP Basic, используя отдельный хранилище учетных данных (в данном случае XML файл, хотя это было бы легко изменить в базе данных или LDAP).

Ответ 3

Я не эксперт, но я думал, что точкой Basic было то, что это была проверка подлинности Windows. Можете ли вы запустить script для синхронизации пользователей БД с вашим Active Directory?

Если это корпоративный AD, вы можете подумать о том, чтобы иметь второй AD только для своего приложения и синхронизировать пользователей как с вашим корпоративным AD, так и с вашей БД. Если вам не нужно синхронизировать пароли (например, создайте страницу pwd-mgmt на своем сайте), вы можете просто использовать скрипты или С# или что-то еще. Если вы хотите что-то более сложное со встроенной синхронизацией паролей, вы можете посмотреть ILM 2007 (скоро это будет FIM 2010).

Ответ 4

Является ли страница файлом .html или .aspx файлом? Если это .aspx, вы должны сохранить эту страницу под анонимным доступом и проверить подлинность в самой логике страницы

Ответ 5

Я написал библиотеку с именем FSCAuth, которая может помочь в этом. Это тривиально можно настроить для простой проверки подлинности без Active Directory. Вместо этого он будет считывать ваши пользовательские данные из базы данных/файла/где бы то ни было (существует даже пользовательский сервер с памятью)

Лицензия BSD в Binpress