http-модуль не может получить правильный URL-адрес страницы

#url #httpmodule

#url #httpmodule

Вопрос:

Привет, у меня есть очень простой вопрос. Я использую http-модуль для предоставления права доступа. Допустим, пользователь является «администратором», после чего он получил разрешение на просмотр страницы.HTTP-модуль получит доступ прямо из базы данных на основе URL-адреса страницы, после чего http-модуль определит, разрешен пользователю доступ или нет.

Вот мой пример кодирования :

  public void Init(HttpApplication context)
    {
        context.AcquireRequestState  = new EventHandler(context_AcquireRequestState1);

    }



    void context_AcquireRequestState1(object sender, EventArgs e)
    {
        try
        {

           string requestUrl = application.Request.AppRelativeCurrentExecutionFilePath.ToString().Trim();
            //return last string of .aspx
         string   requestAspx = requestUrl.Substring(requestUrl.LastIndexOf('/')   1).Trim();

    }
 

но httpmodule будет выполняться несколько раз. Он не может правильно получить URL-адрес.
Например, в первый раз он может получить ~/Module/Admin/Role/RoleManagementList.aspx.
тогда во второй раз будет получен неправильный url ~/favicon.ico.Кто-нибудь может помочь мне решить эту проблему? большое вам спасибо

Ответ №1:

Вы не получаете «неправильный» URL. Браузер пользователя просто делает другой запрос для другого ресурса. Ваш http-модуль будет выполняться для каждого http-запроса, что будет означать по одному для каждого ресурса в дополнение к «странице», такой как значки (отображаются в URL-адресе браузера и иногда запрашиваются, даже если у вас их нет) Или изображения, внешние файлы .css, внешние файлы .js и т. Д., На Которые ссылаютсяна странице (если они не обслуживаются напрямую IIS в обход ASP.NET стек). Вам нужно будет учитывать все эти URL-адреса в вашем модуле.

В зависимости от того, насколько жестко вы контролируете свою среду развертывания, вы также можете / вместо этого иметь возможность освобождать определенные расширения файлов от каждого попадания asp.net имея IIS, вы просто обслуживаете их напрямую. См http://msdn.microsoft.com/en-us/library/ms972953.aspx

Комментарии:

1. Привет, спасибо за ваш комментарий. тогда есть какое-либо решение для получения правильного HTTP-URL? Например, я хочу получить URL, такой как ~/Module/Admin/Role/RoleManagementList.aspx. Или, может быть, это можно сделать на другом шаге http-модуля? например, preInt или другое?

2. Вы думаете об этом неправильно. Вам будет предоставлен URL-адрес запроса — вы не можете «получить» другой URL. Вам нужно будет решить, как вы хотите реагировать на указанный вам URL-адрес. Итак, в зависимости от ваших требований, вы можете решить, например, что вы будете просто проходить через любые URL-адреса, не заканчивающиеся на .aspx. Или вы можете просто решить пройти через URL-адреса, заканчивающиеся на «.ico» или что-то еще. Только вы можете решить, как вы хотите реагировать на них.

3. Привет, Натан. спасибо за вашу помощь. Однако у меня все еще есть один вопрос, который нужно задать вам. Могу ли я использовать http-модуль для управления видимой кнопкой? Допустим, я получаю доступ прямо из базы данных. Тогда мне не разрешено удалять. Таким образом, для всех кнопок удаления на видимой странице установлено значение false. Возможно ли это сделать? Возможно, используя метод FindControl

4. Нелегко или надежно. Если вы хотите отключить отдельные кнопки, вам лучше использовать другой подход. Вы можете рассмотреть возможность использования API членства ( msdn.microsoft.com/en-us/library/ff648345.aspx ) в сочетании с HttpContext.Current.User. IsInRole(…) в фактическом коде страницы, чтобы отключить кнопки. В целом, однако, чтобы действительно обеспечить безопасность на основе ролей, вы должны выполнить проверки безопасности вокруг фактического кода, предварительно формирующего действие удаления. Только отключение кнопок (хотя и полезно для удобного пользовательского интерфейса) может быть взломано, чтобы разрешить удаление даже без разрешения.