ActionFilter By Property属性中的Change Request



我正在编写一个为administratorsemployees提供服务的.Net coreAPI。这些人看到了相同的界面。

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

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

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

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

我想有一个操作过滤器,在action filter中,如果它具有所需的角色,我想将JWT中的employeeId赋予具有此属性的请求变量。在这种情况下为deciderId。这可能吗?我找不到按属性筛选请求参数的方法。

或者有更好的方法吗?我可以用相同的业务在不同的API中进行这些操作,但我不确定是否正确

最好将您的Get API分离,并为管理员设置Authrozie属性和角色管理员,还可以为员工设置另一个Get。

如果您创建了类似的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
}