Context.User теряет роли после назначения в Global.asax.Application_AuthenticateRequest

Я использую проверку подлинности с помощью форм в моем приложении asp.net (3.5). Я также использую роли, чтобы определить, какой пользователь может получить доступ к каким подкаталогам приложения. Таким образом, соответствующие разделы моего файла web.config выглядят так:

<system.web>
  <authentication mode = "Forms">
    <forms loginUrl = "Default.aspx" path = "/" protection = "All" timeout = "360" name = "MyAppName" cookieless = "UseCookies"  />      
  </authentication>
  <authorization >
    <allow users = "*"/>
  </authorization>
</system.web>

<location path = "Admin">
  <system.web>
    <authorization>
      <allow roles = "Admin"/>
      <deny users = "*"/>
    </authorization>
  </system.web>
</location>

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

Аутентификация пользователя, сохранение билета аутентификации и другие связанные проблемы работают нормально. Если я удалю теги из файла web.config, все будет работать нормально. Проблема возникает, когда я пытаюсь обеспечить, чтобы только пользователи с ролью администратора могли получить доступ к каталогу администратора.

На основе этого Статья в MS KB и других веб-страниц, содержащих ту же информацию, я добавил следующий код в свой файл Global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Однако, когда я пытаюсь войти в систему, я не могу получить доступ к папке администратора (меня перенаправляют на страницу входа).

Пытаясь отладить проблему, если я выполняю запрос, если я выполняю Context.User.IsInRole ("Admin") в строке, отмеченной выше Debug # 1, он возвращает false. Если я выполню тот же оператор в строке Debug # 2, он станет истинным. Так что, по крайней мере, что касается Global.asax, роль назначается правильно.

После Global.asax выполнение переходит прямо на страницу входа в систему (поскольку отсутствие роли приводит к отклонению загрузки страницы в папке администратора). Однако, когда я выполняю тот же оператор в первой строке Page_Load входа в систему, он возвращает false. Таким образом, где-то после Application_AuthenticateRequest в Global.asax и начальной загрузки WebForm в ограниченном каталоге информация о роли теряется, что приводит к сбою аутентификации (примечание: в Page_Load правильный билет аутентификации по-прежнему назначается Context.User.Id - теряется только роль).

Что я делаю не так и как заставить его работать правильно?


Обновление: я вошел в решение ниже

Смотрите, что: stackoverflow.com/questions/3669204/…

user1046283 15.11.2011 00:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
5 899
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

На всякий случай перезаписывается отказом.

(У меня были образцы кода, но они не появлялись.

@ ИорданияH - Из того, что я читал на нескольких сайтах (<A href = "codeproject.com/KB/web-security/…), пользователи запрещают указывать после разрешающих ролей. Если запретить приходит первым, то разрешение никогда не сработает. То, как это происходит сейчас, должно разрешать определенные роли , а затем отказывать всем, кто не соответствует ранее определенным ролям (я также попробовал ваше предложение, и оно не сработало).

Yaakov Ellis 11.09.2008 17:36
Ответ принят как подходящий

Вот проблема и решение:

Ранее в процессе разработки я зашел в меню «Веб-сайт» и щелкнул «Конфигурация Asp.net». В результате в файл web.config была добавлена ​​следующая строка:

<system.web>
  <roleManager enabled = "true" />
</system.web>

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

После того, как эта строка была удалена из web.config, все заработало отлично.

Другие вопросы по теме