【发布时间】:2019-11-29 14:32:43
【问题描述】:
我有一个简单的 ASP.NET Core http API,并且有很多控制器操作都是这样开始的:
public async Task<ActionResult> Delete()
{
if (!User.Claims.TryGetClaim("merchant_id", out long merchantId))
{
return BadRequest();
}
/* Real code using merchantId */
}
我想减少每次索赔检查的重复次数,但我不确定如何去做。我的代码尽可能小,只使用扩展方法,但我想让它更小,像这样:
public async Task<ActionResult> Delete([FromClaims] long merchantId)
{
/* Real code using merchantId */
}
但我一直在阅读有关 ASP.NET 核心中间件的文档,但我不知道我必须实现什么才能实现这一目标。
内置的FromBody 属性继承自IBindingSourceMetadata,它定义了一个BindingSource 属性。但是,我在网上找不到任何关于如何实现自己的绑定源以从用户声明中获取项目的资源。
【问题讨论】:
-
我认为中间件可以解决您的问题
-
@dcg 嗯,我知道。这就是我的问题。
-
您真的想要绑定,还是只是想要一种简单的方法来检索商家 ID?如果你想要一些可以注入服务等的东西,我可以分享一些我用于类似的代码。
-
如果您添加中间件,您仍然需要检查每个操作方法。角色也是声明,因此您可以制定自定义策略并添加 [Authorize(Policy = "CustomPolicy")] 控制器范围。或覆盖控制器中的“OnActionExecuting”以检查控制器范围
-
我想我实际上不需要绑定,只是要求和获取商家 ID 的简单方法
标签: c# asp.net-core model-view-controller model-binding