当初始请求来自浏览器或独立程序时,DNN TabController.GetPortalTabs returns 不同的结果
DNN TabController.GetPortalTabs returns different results when initial request comes from a browser or a standalone program
我正在创建一个 API 以基于 DnnApiController 从外部访问来自 DNN 的内容。
其中一个端点应该 return 用户有权访问的所有页面。页面列表填充有 DotNetNuke.Entities.Tabs.TabController.GetPortalTabs(PortalSettings.PortalId, -1, true, string.Empty, true, false, true, true, false)
当请求来自浏览器或 Postman 客户端时,这工作正常,但当调用方是独立应用程序(在本例中是测试 WPF 应用程序)时,结果是错误的。
从 browser/postman 调用时,return 编辑了 10 个选项卡,但从 WPF 调用时只有 5 个。
有什么想法吗?
我的猜测是,在 GetPortalTabs 函数重载内部,它正在根据当前用户进行一些处理:UserController.Instance.GetCurrentUserInfo()。此方法查看 HttpContext 以获取当前用户。它使用当前用户来过滤掉用户没有权限的选项卡。如果从外部服务调用,HttpContext.Current 将为空。因此,选项卡可能会被所有用户权限可用的选项卡过滤。
最终通过实例化一个新的 TabController
解决了这个问题,获取门户中的所有选项卡然后按如下方式过滤
var controller = new DotNetNuke.Entities.Tabs.TabController();
var tabs = controller.GetTabsByPortal(PortalSettings.PortalId)
.Where(t => DotNetNuke.Security.Permissions.TabPermissionController.CanViewPage(t.Value))
.Select(t => t.Value);
虽然效率较低,因为所有页面现在都在过滤之前返回,但它确实有效,而且 API 不会被过度使用,所以这不是世界末日。
我正在创建一个 API 以基于 DnnApiController 从外部访问来自 DNN 的内容。
其中一个端点应该 return 用户有权访问的所有页面。页面列表填充有 DotNetNuke.Entities.Tabs.TabController.GetPortalTabs(PortalSettings.PortalId, -1, true, string.Empty, true, false, true, true, false)
当请求来自浏览器或 Postman 客户端时,这工作正常,但当调用方是独立应用程序(在本例中是测试 WPF 应用程序)时,结果是错误的。
从 browser/postman 调用时,return 编辑了 10 个选项卡,但从 WPF 调用时只有 5 个。
有什么想法吗?
我的猜测是,在 GetPortalTabs 函数重载内部,它正在根据当前用户进行一些处理:UserController.Instance.GetCurrentUserInfo()。此方法查看 HttpContext 以获取当前用户。它使用当前用户来过滤掉用户没有权限的选项卡。如果从外部服务调用,HttpContext.Current 将为空。因此,选项卡可能会被所有用户权限可用的选项卡过滤。
最终通过实例化一个新的 TabController
解决了这个问题,获取门户中的所有选项卡然后按如下方式过滤
var controller = new DotNetNuke.Entities.Tabs.TabController();
var tabs = controller.GetTabsByPortal(PortalSettings.PortalId)
.Where(t => DotNetNuke.Security.Permissions.TabPermissionController.CanViewPage(t.Value))
.Select(t => t.Value);
虽然效率较低,因为所有页面现在都在过滤之前返回,但它确实有效,而且 API 不会被过度使用,所以这不是世界末日。