[英]C# Web api confirm that JWT token sender is equal to parameter of endpoint
我有一個 ASP.net Web api 端點,如下所示。 它通過帶有 via Roles 的 JWT 令牌授權角色:
[HttpPost, Authorize(Roles = "Admin, Teacher")]
public async Task<ActionResult<CourseParticipant>> AddCourseParticipant(Guid userID, Guid CourseID)
{
return Ok(await _calendarParticipantService.AddCalendarParticipant(userID, CourseID));
}
現在,我不希望任何老師能夠更改參與者。 只有“擁有”課程的老師。 我的想法是簡單地將老師的GUID添加到JWT令牌,然后進行比較。 但是我如何讀取請求中的 JWT 令牌? 有沒有更簡單或“正確”的方法來做到這一點?
起初我想推薦policy based authorization 。 但是由於您需要授權中的實際數據來檢查所有權,所以這不是正確的方法。
基於資源的授權是關鍵詞。 使用基於資源的授權,您可以為資源 ( Course
) 編寫 AuthorizationHandler 並將其應用於策略。
創建這樣的帳戶時,您需要將教師指南添加到users
聲明中。
//create user account for teacher ommited
var teacherUser = await _userManager.CreateAsync(identityUser, userDto.Password);
_userManager.AddClaimAsync(teacherUser, new Claim
{
"user_id", $"{teacherUser.Id}"
});
現在更新您的 api 端點,如下所示。 同時在 controller 中Inject
UserManager
[HttpPost, Authorize(Roles = "Admin, Teacher")]
public async Task<ActionResult<CourseParticipant>> AddCourseParticipant(Guid userID, Guid CourseID)
{
var user = await _userManager.FindByIdAsync(userID.ToString());
if(await _userManager.IsInRoleAsync(user, "Teacher"))
{
var userClaim = User.Claims.FirstOrDefault(x => x.Type == "user_id");
if(userClaim == null || userClaim.Value != userID.ToString())
{
return Unauthorized;
}
}
return Ok(await _calendarParticipantService.AddCalendarParticipant(userID, CourseID));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.