Context.Пользователь теряет роли после назначения в Global.asax.Application_AuthenticateRequest
-
09-06-2019 - |
Вопрос
Я использую аутентификацию с помощью форм в своем приложении 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.
(У меня были примеры кода, но они не отображались.