Добавление пользовательского IHttpModule в web.config выдает ошибку 500 - PullRequest
0 голосов
/ 10 ноября 2018

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

Однако, прежде чем я туда доберусь, мне просто нужен мой собственный IHttpModule для вызова.

Я скопировал этот код из сети как базовый шаблон, чтобы начать:

public class UrlAuthorizationModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
        context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
    }

void context_AuthenticateRequest(object sender, EventArgs e)
{
    var sting = "";
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
    HttpApplication context = (HttpApplication)sender;

    if (context.Request.Url.AbsoluteUri.Contains("Oregon"))
        return;
    else
        throw new UnauthorizedAccessException();

    //if (context.User != null && context.User.Identity.IsAuthenticated)
    //{
    //    HttpContext _httpContext = context.Context;
    //    SiteMapNode node = SiteMap.Provider.FindSiteMapNode(_httpContext);
    //    if (node == null)
    //        throw new UnauthorizedAccessException();
    //}
}

public void Dispose()
{
}
}

И я поместил это в web.config:

  <system.web>
    <httpModules>
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />

Однако это не вызывали вообще. Ничего не происходило Затем я понял, что, вероятно, использую iis7, поэтому добавил:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
  <add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v17.2, Version=17.2.5.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A" name="ASPxHttpHandlerModule" />

К сожалению, как только я добавлю тэг «add» внутри system.webServer / modules, сайт вообще не загрузится. Вместо этого генерируется общая ошибка 500.

Ошибка сервера

500 - Внутренняя ошибка сервера.

Проблема с ресурсом, который вы ищете, не может быть отображено.

Насколько я могу судить, мой синтаксис правильный. Пользовательский модуль DevExpress работает правильно, и из-за него не выдается никаких ошибок, поэтому я знаю, что именно мои дополнения вызывают проблемы. Если я удаляю строку «добавить», то сайт загружается правильно, он просто не вызывает мой пользовательский IHttpModule.

Ничего не отображается в системном журнале. Это должно быть что-то действительно глупое, я просто не вижу этого.

EDIT: Я использую Microsoft Visual Studio 2017 (которая использует IISExpress) на моей локальной машине win 10 dev. Я нашел некоторые файлы TraceLogFiles по адресу: C: \ Users \ username \ Documents \ IISExpress \ TraceLogFiles \ website \ fr000001.xml и внутри, где была эта ошибка.

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
 <System>
  <Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
  <EventID>0</EventID>
  <Version>1</Version>
  <Level>3</Level>
  <Opcode>16</Opcode>
  <Keywords>0x100</Keywords>
  <TimeCreated SystemTime="2018-11-13T15:25:30.609Z"/>
  <Correlation ActivityID="{80001795-0008-FD00-B63F-84710C7967BB}"/>
  <Execution ProcessID="41168" ThreadID="40824"/>
  <Computer>machine name</Computer>
 </System>
 <EventData>
  <Data Name="ContextId">{80001795-0008-FD00-B63F-84710C7967BB}</Data>
  <Data Name="ModuleName">IIS Web Core</Data>
  <Data Name="Notification">1</Data>
  <Data Name="HttpStatus">500</Data>
  <Data Name="HttpReason">Internal Server Error</Data>
  <Data Name="HttpSubStatus">19</Data>
  <Data Name="ErrorCode">2147942433</Data>
  <Data Name="ConfigExceptionInfo">\\?\C:\Users\username\Documents\websitepath\web.config ( 394) :Lock violation
</Data>
 </EventData>
 <RenderingInfo Culture="en-US">
  <Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
  <Keywords>
   <Keyword>RequestNotifications</Keyword>
  </Keywords>
  <freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
  <freb:Description Data="ErrorCode">The process cannot access the file because another process has locked a portion of the file.
 (0x80070021)</freb:Description>
 </RenderingInfo>
 <ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
  <EventGuid>{002E91E3-E7AE-44AB-8E07-99230FFA6ADE}</EventGuid>
 </ExtendedTracingInfo>
</Event>

Насколько я могу судить, он жалуется, что файл web.config заблокирован другим процессом. Но это не имеет смысла. Просто чтобы быть в безопасности, я изменил порт разработчика, над которым работал, на новое случайное число со старого случайного числа, которое я использовал, и это не имело никакого влияния. Учитывая, что сайт работает без пользовательского модуля, это означает, что базовые разрешения для файлов web.config в порядке.

1 Ответ

0 голосов
/ 13 ноября 2018

Мне удалось найти ответ в этом посте .

По какой-то причине тег «удалить» внутри модулей:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="UrlAuthorization" />
</modules>

больше не разрешен внутри system.webServer. И брошенная ошибка не супер велика. Как только я удалил этот тег (оставив два пользовательских тега добавления), сайт по крайней мере снова начал отображаться.

Этот пост указал мне на файл applicationhost.config, где я смог изменить $ (SolutionDir) .vs \ Config \ ApplicationHost.config

<add name="UrlAuthorizationModule" lockItem="true" />

и замените его на

<add name="UrlAuthorizationModule" lockItem="false" />

Тогда я смог успешно использовать тег удаления в моем локальном web.config.

<modules runAllManagedModulesForAllRequests="true">
  <remove name="UrlAuthorizationModule" />
</modules>
...