通过 属性 属性更改 ActionFilter 中的请求
Change Request in ActionFilter By Property attributes
我正在编写服务于 administrators
和 employees
的 .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
}
我正在编写服务于 administrators
和 employees
的 .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
}