通过 属性 属性更改 ActionFilter 中的请求

Change Request in ActionFilter By Property attributes

我正在编写服务于 administratorsemployees.Net core API。这些人看到的是同一个界面。

唯一不同的是manager可以查看其他员工的profile。员工只能查看自己的个人资料。我正在使用 JWT。我已经完成了管理员部分的开发。

我也想在员工部分使用相同的 API。但是在这一部分,我需要从 JWT 中获取 employeeId,而不是从请求中获取 employeeId

我为表示 employeeId 的字段创建了一个属性。示例:

public async Task<ActionResult<AddressDto>> Get(long deciderType, [EmployeeId] long deciderId)

我想要一个动作过滤器,因为 action filter 如果它具有所需的作用,我想将 JWT 中的 employeeId 赋予具有此功能的请求变量属性。在本例中为 deciderId。这可能吗?我找不到按属性过滤请求参数的方法。

或者有更好的方法吗?我可以在同一家公司的不同 API 中执行这些操作,但我不确定这是否是正确的方法

最好将您的 Get API 分开,并为您的管理员设置 Authrozie 属性 Role Admin,并为 员工.

如果您已经像这样创建了 JWT

var tokenDescriptor = new SecurityTokenDescriptor
{
  Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, user.Id.ToString())
            }),
  Expires = DateTime.UtcNow.AddDays(7),
  SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), 
  SecurityAlgorithms.HmacSha256Signature)
};

现在在属于员工的 Get 方法中,您不需要发送 EmployeeId,您可以从 JWT 令牌中获取它

var claimsIdentity = this.User.Identity as ClaimsIdentity;
var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;

总之,您将有两个 Get 端点。

对于管理员

 [Authorize(Role=RolesEnumeration.Admin)]
 public async Task<IActionResult<AddressDto>> Get()
 {
       //get all addresses from the DB by pagination
 }

员工

public async Task<IActionResult<AddressDto>> Get()
 {
     var claimsIdentity = this.User.Identity as ClaimsIdentity;
     var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;

     //get employee address from the DB by userId
 }