Основные вопросы членства в ASP.Net - PullRequest
3 голосов
/ 23 марта 2012

У меня проблема с PrinciplePermissionAttribute, вызывающим исключения. Любые страницы, где у меня есть атрибут метода Load, выдают исключение сразу после первого входа в систему.

<PrincipalePermission(SecurityAction.Demand, role:="Level1")> _
Protected Sub Page_Load(ByVal sender As Object, ByVal e as System.EventArgs) Handles Me.Load
End Sub

Это исключение Request for principal permission failed.

Если я удаляю это, страница загружается нормально, и я могу перейти на другую страницу, которая имеет такой же атрибут, и она работает безупречно. Также, если я использую функцию Членства Roles.IsUserInRole(), у меня нет проблем.

Я заметил, что после первоначального входа мой Thread.CurrentPrincipal имеет тип GenericPrincipal, а не RolePrincipal. Последующие запросы показывают правильный тип вместо универсального. Я попытался форсировать это в файле Global.asax в событии PostAuthenticate, но asp.net, похоже, устанавливает GenericPrincipal после того, как это произойдет.

Любые идеи о том, как исправить это поведение, или я застрял, используя метод Roles.IsUserInRole()?

UPDATE
После нахождения некоторого объяснения тому, что происходит в конвейере здесь , я могу понять, почему его изменение в Global.asax не помогло. У меня был прототип проекта, который я проверил ранее, и я не смог воспроизвести его там. Мне интересно, имеет ли это какое-либо отношение к типу проекта. Прототип является проектом веб-сайта, а проблемным является проект веб-приложения.

Мне кажется странным, что GenericPrincipal меняется на RolePrincipal, но только после того, как начальный запрос обработан. Так что трудно сказать, что он не работает, как будто его просто не происходит до того, как исполняется мой Page_Load.

1 Ответ

0 голосов
/ 23 марта 2012

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

Атрибут PrincipalPermission проверяет Thread.CurrentPrincipal. Roles.IsUserInRole () проверяет HttpContext.Current.User. Поэтому, если они отличаются, вы можете исправить это в файле Global.asax в событии Application_AuthenticateRequest.

...