Я использую проверку подлинности с помощью форм в моем приложении 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 - теряется только роль).
Что я делаю не так и как заставить его работать правильно?
Обновление: я вошел в решение ниже





это всего лишь случайный выстрел, но вас не блокируют из-за порядка авторизации для администратора? Может быть, вам стоит попробовать переключить запретить все и все администратора.
На всякий случай перезаписывается отказом.
(У меня были образцы кода, но они не появлялись.
@ ИорданияH - Из того, что я читал на нескольких сайтах (<A href = "codeproject.com/KB/web-security/…), пользователи запрещают указывать после разрешающих ролей. Если запретить приходит первым, то разрешение никогда не сработает. То, как это происходит сейчас, должно разрешать определенные роли , а затем отказывать всем, кто не соответствует ранее определенным ролям (я также попробовал ваше предложение, и оно не сработало).
Вот проблема и решение:
Ранее в процессе разработки я зашел в меню «Веб-сайт» и щелкнул «Конфигурация Asp.net». В результате в файл web.config была добавлена следующая строка:
<system.web>
<roleManager enabled = "true" />
</system.web>
С этого момента приложение предполагало, что я выполняю роли через менеджер сайта Asp.net, а не через роли FormsAuthentication. Таким образом, повторялись сбои, несмотря на то, что фактическая логика аутентификации и ролей была настроена правильно.
После того, как эта строка была удалена из web.config, все заработало отлично.
Смотрите, что: stackoverflow.com/questions/3669204/…