ASP.Net - использование базовой проверки подлинности без использования пользователей Windows
У нас есть веб-приложение ASP.Net, работающее на IIS6, которое управляет собственной базой данных пользователей.
Сам сайт просто разрешает анонимный доступ, а вся аутентификация/безопасность управляется с использованием самого нашего приложения.
У нас есть страница, содержащая таблицу данных HTML, которую мы импортируем в Excel, и затем используется для целей отчетности. Страница в настоящее время не имеет безопасности.
Нам нужно добавить безопасность на эту страницу, чтобы эти таблицы попадали в чужие руки, тогда данные не могут быть "Обновлены" без предоставления имени пользователя/пароля.
Если я установил эту страницу, чтобы не разрешать доступ к Anonymouse, я могу использовать аутентификацию Basic/Windows с пользователями Windows, чтобы защитить эту страницу. Затем, когда Excel обновляет данные, открывается диалоговое окно пароля.
Проблема в том, что мне нужно иметь возможность защищать эту страницу на основе пользователей в нашей базе данных, и они не будут пользователями Windows. Я также должен сделать это таким образом, чтобы Excel мог управлять аутентификацией, исключающей аутентификацию на основе форм.
У кого-нибудь есть идеи? Можно ли заставить IIS искать в другом месте для нее базовую аутентификацию?
Ответы
Ответ 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