【发布时间】:2019-03-28 16:04:04
【问题描述】:
我想将某些功能限制为仅限购买了精英套餐的订阅者。 要确定用户是否是订阅者,我必须去存储库并查询该用户是否至少有 1 个活动包。
我正在应用基于策略的授权。最终我必须通过一个服务来访问存储库层进行查询,但是因为 AuthorizationHandler 是一个单例,它不消耗服务。
我正在考虑是否可以在用户表中创建一个额外的计算列,以指示用户是否有活动包。
在这种情况下,最佳做法是什么?如果用户购买了产品(包),如何授权?
【问题讨论】:
-
你能把
IServiceProvider类注入构造函数吗?然后您可以CreateScope获取范围内的数据库上下文来执行查询。或者,更好的是,只需在用户声明中包含一个包,然后您就可以在政策检查中使用它 -
@Neil 如何在用户声明中包含一个包?我可以在记录过程中为 ControllerBase.User 添加属性,但我不知道如何向 AuthorizationHandlerContext.User 添加声明以进行策略检查。
-
如果您正在使用基于策略的授权,那么您已经在使用声明。你只需要添加你自己的。
-
您可以在用户订阅时为其设置声明,然后只需检查此声明而不是进入回购。但是,在设置声明以刷新后,您必须注销用户并重新登录。不过,这可以通过编程方式完成,而无需强制用户重新登录。
标签: c# asp.net-core-mvc authorize-attribute asp.net-authorization