2014-09-04 8 views
0

Я запустил веб-сайт ASP.NET, который использовал проверку подлинности форм. Фактически, пользователю ничего не нужно было вводить - я взял Request.ServerVariables["LOGON_USER"] и просмотрел это имя пользователя в определенной базе данных SQL с использованием пользовательского класса EmployeeInfo, а затем в зависимости от результата пользователь был перенаправлен на страницу по умолчанию или на страницу с ошибкой, отображающую разные сообщения в зависимости от на тип ошибки:Проверка подлинности Windows для проверки подлинности (из базы данных)

Web.config:

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx"/> 
</authentication> 
<authorization> 
    <deny users="?"/> 
</authorization> 

Login.aspx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     FormsAuthentication.SignOut(); 
     string UserName = Request.ServerVariables["LOGON_USER"]; 
     EmployeeInfo CurrentEmployee = EmployeeInfo.RequestDBInfo(UserName); // SQL magic here 
     if (CurrentEmployee = null) 
      Response.Redirect("AccessDenied.aspx?Message=NoInfo"); 
     else 
      if (CurrentEmployee.Suspended = true) 
       Response.Redirect("AccessDenied.aspx?Message=Suspended"); 
       if (CurrentEmployee.Expired = true) 
        Response.Redirect("AccessDenied.aspx?Message=Expired"); 
        if (CurrentEmployee.Position = null) 
         Response.Redirect("AccessDenied.aspx?Message=NoPosition"); 
        else 
         FormsAuthentication.RedirectFromLoginPage(CurrentUserName, true); 
    } 
} 

Он не работал хорошо до недавнего времени мы должны были перейти к проверке подлинности Windows, для се причины. Теперь в случае недействительного пользователя мой сайт открывает по умолчанию Login.aspx и перенаправляет пользователя на соответствующую страницу с ошибкой. Но пользователь может открыть любую страницу, просто набрав ее URL-адрес, потому что, конечно, не выполняется аутентификация формы, и пользователь успешно аутентифицируется Windows.

Так что мой вопрос:

Что лучше практика осуществить дополнительную проверку по базе данных поверх проверки подлинности Windows? Насколько я понимаю, мне нужно изменить Application_AuthenticateRequest в Global.asax?

ответ

0

Из приведенной информации звучит так, будто вы используете IIS с включенным включением «Встроенная проверка подлинности Windows», «Разрешить анонимность» в настройках. Все пользователи вашего сайта проходят аутентификацию между своим веб-браузером и сервером (и базовой сетевой инфраструктурой). После проверки подлинности IIS проверяет ACL на файлах ресурсов веб-сайта, чтобы убедиться, что они имеют право даже запрашивать файл (через NTFS), и, по-видимому, это правильно настроено, так что запросам разрешено достичь вашего кода ASP.Net , Итак, теперь, когда ваш код достигнут, давайте начнем с некоторой стратегии:

Вы упомянули Application_AuthenticateRequest. Это отличный способ сделать это, так как это дает вам точку инъекции для написания специального кода безопасности, после того как запросчик был аутентифицирован с помощью настроенных параметров безопасности (сначала IIS, затем все, что установлено в вашем веб-стандарте, включало настраиваемые модули). Кроме того, вы можете написать свой код безопасности только в этом разделе, и он будет выполнен для каждой страницы вашего сайта. Когда вы пишете код для этого метода, вы можете проверить, проверен ли текущий пользователь, указав, что HttpContext.Current.User не является нулевым, а HttpContext.Current.User.IsAuthenticated - true. Вы можете получить идентификатор сети пользователя из свойства User, как вы привыкли использовать `Request.ServerVariables [" LOGON_USER "] '. После того, как у вас есть идентификатор, вы можете выполнить поиск по базе данных, а затем перенаправить соответственно.

По соображениям производительности вы можете захотеть кэшировать эту информацию, если это приемлемо под вашей моделью безопасности. Например, простой способ состоял бы в том, чтобы сохранить объект безопасности с их разрешениями в Session. Затем вы можете проверить это первым, и если у них нет сеанса аутентификации, затем выполните поиск базы данных и т. Д.