Context.User.Identity.IsAuthenticated всегда аутентифицирован? - PullRequest
1 голос
/ 03 марта 2011

Я пытаюсь создать httphandler, который будет перехватывать образец pdf файла, который есть у нас на сайте. Httphandler отлично работает на моей машине для разработки и даже на локально опубликованном веб-сайте, что если я просто попытаюсь подключиться к тестовой ссылке: https://test.com/admin/_/sample_reports/sample.pdf Меня отправят на страницу с недействительным доступом.

Итак, отправляя его на наш компьютер IIS6, когда я пытаюсь перейти по URL-адресу, он подает документ PDF. context.User.Identity.IsAuthenticated всегда отображается как true.

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

public void ProcessRequest(HttpContext context)
{
    if (context.User.Identity.IsAuthenticated)
    {
        string SampleURL = context.Request.AppRelativeCurrentExecutionFilePath;

        context.Response.Buffer = true;
        context.Response.Clear();
        using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(SampleURL),FileMode.Open))
        {
            int length = (int)fs.Length;
            byte[] buffer;

            using (BinaryReader br = new BinaryReader(fs))
            {
                buffer = br.ReadBytes(length);
            }

            context.Response.Clear();
            context.Response.Buffer = true;
            context.Response.ContentType = "application/pdf";
            context.Response.BinaryWrite(buffer);
            context.Response.End();
        }
    }
    else
    {
        context.Response.Redirect(
           "~/Error/invalid_access.aspx");
    }}

в web.config У меня есть следующее для проверки подлинности формы:

<authentication mode="Forms">
  <forms name="Sample.Web" loginUrl="~/Security/" defaultUrl="~/default.aspx" protection="All" timeout="60" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="">
  </forms>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

Context.User.Identity.IsAuthenticated свойство имеет значение true, когда cookie-файл проверки подлинности все еще установлен и все еще действителен (не истек) для проверки подлинности форм.

В случае проверки подлинности с помощью форм, модуль проверки подлинности форм использует зашифрованный билет аутентификации содержится в куки аутентификации аутентифицировать пользователя. Как только это сделал это, он заменяет GenericIdentity в Context.User.Identity с FormsIdentity объект, который возвращает true от IsAuthenticated свойство.

Итак, ваш файл авторизации еще жив; это может быть вызвано вызовом одного из тех FormsAuthentication методов, как RedirectFromLoginPage или SetAuthCookie, которые устанавливают файл cookie аутентификации; или просто забытым печеньем.

Также было бы лучше использовать HttpRequest.IsAuthenticated вместо Context.User.Identity.IsAuthenticated для вашего примера. Он проверяет, является ли HttpContext.User и HttpContext.User.Identity не null, а свойство HttpContext.User.Identity.IsAuthenticated установлено на true. В вашем случае, когда, например, HttpContext.User равно null ваш код будет выбрасывать NullReferenceException.

2 голосов
/ 05 марта 2011

Вы уверены, что

Итак, отправляя его на наш компьютер IIS6, когда я пытаюсь перейти по URL, он подает документ PDF. context.User.Identity.IsAuthenticated всегда отображается как true.

Этот запрос .PDF, возможно, уже обработан статическим обработчиком файлов IIS 6 вместо вашего обработчика HTTP в IIS 6.

0 голосов
/ 03 марта 2011

Вам нужно использовать ProcessRequest

public void ProcessRequest(HttpContext context)
{
    if (!context.User.Identity.IsAuthenticated)
    {
         context.Response.Redirect(
           "~/Error/invalid_access.aspx");
    }

}

РЕДАКТИРОВАТЬ : Может быть, IIS является виновником, есть ли у вас следующий набор?В IIS анонимный доступ включен для всех приложений, использующих проверку подлинности форм

<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...