【问题标题】:Dotnet: Authorize If users have a subscriptionDotnet:授权如果用户有订阅
【发布时间】: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


【解决方案1】:

您可以有一个单例服务,它为您的 AuthorizationHandler 提供信息(取决于您使用的 IoC 容器 - 或只是一个初始实例),这将起作用。

如果您可以有一个与用户相关联的字段(并且可能包含在身份验证令牌中,具体取决于安全实施),这可以显着提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2019-02-08
    • 2019-06-18
    • 2017-08-23
    • 1970-01-01
    • 2018-03-12
    • 2016-11-05
    • 2020-01-11
    相关资源
    最近更新 更多