我遇到了导致异常的 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
这会引发异常请求主体权限失败
。
如果我删除此页面,则页面加载正常,并且我可以导航到具有相同属性的另一个页面,并且它可以完美地工作。另外,如果我使用成员(member)系统 Roles.IsUserInRole()
函数,我就没有问题。
我注意到,初次登录后,我的 Thread.CurrentPrincipal
类型为 GenericPrincipal
,而不是 RolePrincipal
。后续请求将显示正确的类型来代替通用类型。我尝试在 PostAuthenticate
事件中的 Global.asax
文件中强制执行此操作,但在发生这种情况后,asp.net 似乎正在设置 GenericPrincipal
。
关于如何修复此行为的任何想法,或者我是否坚持使用 Roles.IsUserInRole()
方法?
更新
在找到对管道中发生的事情的一些解释之后here我明白为什么在 Global.asax 中更改它没有帮助。我之前有一个原型(prototype)项目,我用它进行了测试,但无法在那里重现它。我确实想知道这是否与项目类型有关。原型(prototype)是一个网站项目,有问题的是一个 Web 应用程序项目。
我确实认为 GenericPrincipal
更改为 RolePrincipal
但仅在初始请求处理后才更改,这很奇怪。所以很难说它不起作用,就像它在我的“Page_Load”执行之前没有发生一样。
最佳答案
我认为您正在使用表单例份验证...
PrincipalPermission 属性检查 Thread.CurrentPrincipal。 Roles.IsUserInRole() 检查 HttpContext.Current.User。因此,如果它们不同,您可以在 Application_AuthenticateRequest 事件的 Global.asax 文件中更正此问题。
关于ASP.Net 成员(member)主体权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9830077/