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

StackOverflow https://stackoverflow.com/questions/56271

Вопрос

Я использую аутентификацию с помощью форм в своем приложении 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 Наряду с другими веб-страницами, предоставляющими ту же информацию, я добавил следующий код в свой файл 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, это будет равно true.Так что, по крайней мере, что касается Global.asax, роль назначается правильно.

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

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


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

Это было полезно?

Решение

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

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

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

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

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

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

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

На всякий случай, если он будет перезаписан Deny.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top