[英]ASP.NET Core: How would I go about binding data from user claims?
我有一个简单的 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
属性。 但是,我在网上找不到任何关于如何实现自己的绑定源以从用户声明中获取项目的资源。
您可以将策略库授权与属性一起使用。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthorization(options =>
{
options.AddPolicy("ShouldHaveMerchantId", policy =>
policy.RequireClaim("merchant_id"));
});
...
}
并在您的操作方法中使用 Authorize 属性和您的策略名称。
[Authorize(Policy = "ShouldHaveMerchantId")]
public async Task<IActionResult> YourActionMethod()
{
//Your logic
}
你可以像这样创建一个中间件
public class MyMiddleware
{
private readonly RequestDelegate next;
public MyMiddleware (RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext ctx)
{
// Your check here, something like
if (!ctx.User.Claims.TryGetClaim("merchant_id", out long merchantId))
{
ctx.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
else
{
await next.Invoke(ctx);
}
}
}
然后像这样注册
app.UseMiddleware<MyMiddleware>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.