我希望能够为我网站的某个区域打开和关闭保护。我使用IdentityServer填充MVC应用程序上的声明,从而确定访问功能。
例如,我声称类型为“video_viewer_role”,在指定时,会确定当前身份是否可以在网站上观看视频。我的想法是,我可以通过索赔来打开和关闭此功能,包括匿名用户。
所以,我想要的是我的Controller Action调用IdentityServer并询问当前用户是否有声明,但没有触发身份验证过程。因此,如果用户未经过身份验证,我将获得“video_viewer_role”的最新声明值,具体取决于在支持身份服务器的声明存储中设置的内容。
这可能吗?
答案 0 :(得分:3)
在你将身份与权限混淆的路线走得太远之前,你应该阅读这个...... https://leastprivilege.com/2016/12/16/identity-vs-permissions/。
理想情况下,您不应该提供有关权限的声明('can_view_video'),尤其是在会话过程中会发生变化的情况下。声明应该模拟用户的身份,而不是他们可以做的事情。然后,靠近受保护的资源,您可以使用该身份验证用户是否有权执行他们尝试执行的操作(即查看视频)。
编辑: 听起来像声称不是正确的机制,恕我直言。声明模仿了用户的身份,因此尝试对匿名用户使用声明是没有意义的......你唯一可以说的是他们是匿名的。
你说你打算'打开/关闭功能',大概是通过数据库,所以为什么不让权限检查机制只检查你的数据库?您可以为控制器创建一个属性('RequiresVideoViewerPermissions'),该属性会在您的数据库中检查您是如何限制视频访问的。例如,您可以在数据库中设置一个名为“VideoViewerRequiredRole”的设置,然后将其值设置为角色,或者如果您希望每个人都能够查看它,则将其设置为null。举个例子,您的登录用户可能具有“MyAppUser”角色,您的管理员“MyAppAdmin”等......
这会删除声明中的权限,并允许您根据您的设置方式为经过身份验证的用户和/或匿名用户控制权限。