Авторизация HTML контента внутри веб-приложения asp.net - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть коллега, который сделал веб-сайт в формате обычного HTML с небольшим количеством CSS и JavaScript.У меня есть специальная задача, чтобы предотвратить эту страницу с помощью простой формы входа.Мой коллега будет постоянно работать над своим html, но ему не разрешается писать какие-либо asp.net или публиковать контент на удаленных серверах.

Я разработчик asp.net, и моей первой идеей было включить все егосодержимое внутри папки проекта веб-приложения с именем «Содержимое».Затем я сделал простую форму входа (login.aspx), а внутри web.config я поместил аутентификацию (с login.aspx в качестве loginUrl) и теги авторизации.После этого я опубликовал весь проект на удаленном сервере и собираюсь поделиться папкой «Содержимое» с этим пользователем.У него будет доступ ко всем html-страницам, и он сможет непрерывно работать над ним, просто копируя свои обновленные или вновь созданные html-файлы в эту папку.

Все, что касается авторизации и аутентификации, прекрасно работает, когда я запускаюэто локально на сервере веб-разработки Visual Studio.Когда я пытаюсь получить доступ к некоторому html-контенту, хранящемуся в папке «Content», я перенаправляюсь на login.apsx, и все работает как положено.

У меня проблема при публикации этого полного веб-приложения asp.netна удаленный сервер.Когда я пытаюсь получить доступ к тому же html-контенту, меня не перенаправляют на login.aspx, и я могу получить доступ ко всем html-страницам внутри «Content» без аутентификации.

Это часть аутентификации и авторизации моего web.config:

  <authentication mode="Forms">
      <forms loginUrl="login.aspx"/>
    </authentication>

    <authorization>
      <deny users="?"/>
    </authorization>

И это содержание моего login.aspx.cs:

if (//USER WEB SERVICE CHECK)
{

        if (Request.QueryString["ReturnUrl"] == null)
        {
            FormsAuthentication.SetAuthCookie(UserName.Text, true);
            Response.Redirect("~/Content/index.html");
        }
        else
        {
            FormsAuthentication.RedirectFromLoginPage(UserName.Text, true);
        }
    }
    else
    {
        FailureText.Text = "Wrong username or password...";
    }
}

У вас есть идея, как это сделать с помощью asp.net?Почему эта форма проверки подлинности не работает, когда я публикую ее?Можно ли предотвратить доступ к простому html-контенту как части веб-приложения, когда все это публикуется?

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

Структура моего проекта веб-приложения следующая:

ApplicationFolder
 |
  - login.aspx
 |
 - web.config
 |
 - CONTENT
        |
         - index.html
         - ...

Кроме того, я попытался поместить некоторый aspx-контент в папку CONTENT, и перенаправление аутентификации работает просто отлично.Можно ли даже использовать проверку подлинности на основе форм для защиты содержимого html внутри веб-приложения?

Удаленный сервер использует IIS 6, а среда выполнения ASP.NET не обрабатывает файлы html, и из-за этого проверка подлинности на основе форм не работает.Я переименовал расширение файла html в aspx, и все работает отлично.Я удовлетворен этим решением на данный момент, но если у кого-то есть лучшее решение, пожалуйста, напишите его здесь ...

Я читал, что есть обходной путь с настройкой веб-сайта на IIS 6 (http://forums.asp.net/t/1184547.aspx),, но ямне не разрешено это делать на моем сервере.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

Откройте IIS, щелкните по рассматриваемому проекту в древовидной структуре сайта.Выберите меню «Аутентификация» и проверьте, включена ли аутентификация с помощью форм.Если это не работает, попробуйте отключить проверку подлинности Windows.

0 голосов
/ 06 марта 2012

Я наконец-то решил эту проблему, если бы у кого-то была такая же проблема, как у меня ...

В любом случае я изменил настройки IIS 6, как описано в http://forums.asp.net/t/1184547.aspx,, написал обработчик пользовательских запросов со следующим кодом ниже

public class DocHandler : IHttpHandler
{

    public DocHandler() { }
    public void ProcessRequest(HttpContext context)
    {
        string path = context.Request.PhysicalPath;
        string name = path.Split('\\')[path.Split('\\').Length - 1];
        if (!string.IsNullOrEmpty(path) && path.ToLower().EndsWith(".pdf"))
        {
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Clear();
            context.Response.Charset = null;
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Type", "application/pdf");
            context.Response.AppendHeader("Content-Disposition", string.Format("inline;filename={0}", name));
            context.Response.WriteFile(path);
        }
        else if (!string.IsNullOrEmpty(path) && path.ToLower().EndsWith(".doc"))
        {
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Clear();
            context.Response.Charset = null;
            context.Response.ContentType = "application/msword";
            context.Response.AddHeader("Content-Type", "application/msword");
            context.Response.AppendHeader("Content-Disposition", string.Format("inline;filename={0}", name));
            context.Response.WriteFile(path); 
        }
        else if (!string.IsNullOrEmpty(path) && path.ToLower().EndsWith(".xls"))
        {
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Clear();
            context.Response.Charset = null;
            context.Response.ContentType = "application/vnd.ms-excel";
            context.Response.AddHeader("Content-Type", "application/vnd.ms-excel");
            context.Response.AppendHeader("Content-Disposition", string.Format("inline;filename={0}", name));
            context.Response.WriteFile(path);
        }
        else if (!string.IsNullOrEmpty(path) && path.ToLower().EndsWith(".ppt"))
        {
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Clear();
            context.Response.Charset = null;
            context.Response.ContentType = "application/vnd.ms-powerpoint";
            context.Response.AddHeader("Content-Type", "application/vnd.ms-powerpoint");
            context.Response.AppendHeader("Content-Disposition", string.Format("inline;filename={0}", name));
            context.Response.WriteFile(path);                
        }
        else if (!string.IsNullOrEmpty(path) && path.ToLower().EndsWith(".html"))
        {        

            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Clear();
            context.Response.Charset = null;
            context.Response.ContentType = "text/html";
            context.Response.AddHeader("Content-Type", "text/html");
            context.Response.AppendHeader("Content-Disposition", string.Format("inline;filename={0}", name));
            context.Response.WriteFile(path);
        }
        else
        {
            throw new System.IO.FileNotFoundException("The page requested is invalid", path);
        }
    }
    public bool IsReusable { get { return false; } }
}

и, наконец, добавил следующий раздел в web.config

<add verb="GET" path="*.pdf" type="PartnerPortal.DocHandler" validate="false" />
<add verb="GET" path="*.doc" type="PartnerPortal.DocHandler" validate="false" />
<add verb="GET" path="*.xls" type="PartnerPortal.DocHandler" validate="false" />
<add verb="GET" path="*.ppt" type="PartnerPortal.DocHandler" validate="false" />
<add verb="*" path="*.html" type="PartnerPortal.DocHandler" validate="false" />
0 голосов
/ 21 февраля 2012

Я думаю, что вам лучше проверить настройки IIS для этого приложения на сервере, должно быть что-то отличное от вашего локального, и вам нужно изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...