簡體   English   中英

C# Web api 確認 JWT 令牌發送者等於端點參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM