【问题标题】:Policy-Based Authorization to enable only Users who are owners to a resource be able to view/edit基于策略的授权,仅允许作为资源所有者的用户能够查看/编辑
【发布时间】:2020-05-11 13:40:53
【问题描述】:

我有一个简单的要求,即在允许查看/编辑资源之前检查登录用户是否是资源的所有者。 我已经能够通过签入每个 ActionResult 来实现这一点,但我很想使用基于策略的授权来实现这一点,文档对这一特定要求保持沉默。

public IActionResult EditPage(int id)
{
   //Check User is the Owner of the resource
   var signedInUserResouceID = ((ClaimsIdentity)User.Identity).FindFirst("ResourceID");
   if(id != signedInUserResourceID)
   {
      //User cannot Edit this resouce
      return RedirectToAction("Index","Home");
   }
   else
   {
      //Rightful owner, allow editing
   }
}

如何使用基于策略的授权来实现这一目标

【问题讨论】:

  • 嗨@Tonto,我的回答是否帮助您解决了您的问题?如果可以,您可以accept as answer吗?
  • 我找到了一种完全删除传递参数的方法。但是当我尝试它并且它有效时,如果它确实会接受它

标签: asp.net-core c#-3.0


【解决方案1】:

将“ResourceID”放入用户声明中并不是实现这一目标的方法。

看看这篇文章,它详细解释了如何实现基于资源的授权:

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-3.1

【讨论】:

  • 资源ID是永久的,即使添加到AspNetUsersTable,也不会改变。所以我只需要将整数值与参数 id 值进行比较。
  • 由于 id 参数是动态的,如果您希望将其与 [Authorize(Policy = "YourCustomPolicy"] 属性一起应用,您必须创建自己的策略,从 Http Request 上下文参数中读取该值。
【解决方案2】:

将以下代码添加到您的 Startup.cs:

services.AddHttpContextAccessor();
services.AddAuthorization(options =>
{
    options.AddPolicy("EmployeeOnly", policy =>
    {
        policy.RequireAssertion(context =>
        {
            //Here you can get many resouces from context, i get a claim here for example
            var yourvalue = context.User.FindFirst("ResourceID").Value;
            //here you can get the query string value
            var id = new HttpContextAccessor().HttpContext.Request.Query["id"];
            //return a boolen to end validation.
            return id==yourvalue;
        });
    });
});

控制器:

[Authorize(Policy = "EmployeeOnly")]
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    public IActionResult EditPage(int id)
    {
        //...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多