簡體   English   中英

Net Core 2.2 MVC WebApi中的JWT“自我”身份驗證

[英]JWT “self” authentication in Net Core 2.2 MVC WebApi

我想通過某種“自我”策略來提高我的API的安全性,以驗證對某些用戶操作(例如DELETE用戶)的調用是由向其頒發令牌的同一用戶進行的。 有沒有一種方法與基於策略的授權類似?

我在Kestrel上運行帶有.NET Core 2.2和MVC WebAPI。 我有用戶,角色和用戶角色,並且具有啟用了角色的基於令牌的身份驗證。 我可以發出令牌,然后使用控制器中的“ Authorize”屬性進行驗證。 但是,我一直在尋找一種方法來驗證對用戶的某些操作僅由用戶自己執行,一種“自我”身份驗證策略來驗證例如用戶3正在嘗試刪除用戶3而僅刪除用戶3我已經仔細研究了聲明和所有內容,我知道我可以提供一個簡單的服務來傳遞聲明和驗證它,但是我想以一種類似於基於策略或基於角色的身份驗證的更平滑的方式進行操作。 我不知道我是否可以使用某種中間件或某種中間件來制作它,但是能夠使其變得盡可能干凈將是很棒的。

[編輯]

主要目的是避免用戶刪除其他用戶創建的資源,並使他們只能刪除自己創建的資源。

[Edit2-解決方案]感謝Paul Lorica的回答,現在我可以描述我是如何做到的。

首先是創建一個Requirement和Handler,類似於Microsoft在文檔中提供的示例。 我們要做的是將Claim添加到我們擁有的令牌生成方法/服務中,並將ID添加為NameIdentifier。 之后,我們在處理程序中注入IHttpContextAccessor。 然后我們可以驗證請求中的ID是否與Claim中的ID相同。 因此,這非常容易。

我正在添加邏輯示例以使其工作。

PS:在啟動環境中將IHttpContextAccessor作為單例注入,否則將不起作用。

處理程序:

public class SelfUserHandler: AuthorizationHandler<SelfUserRequirement>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        public SelfUserHandler(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                       SelfUserRequirement requirement)
        {
            if (!context.User.HasClaim(c => c.Type == ClaimTypes.NameIdentifier))
            {
                return Task.CompletedTask;
            }

            var nameIdentifier = context.User.FindFirst(c => c.Type == ClaimTypes.NameIdentifier).Value;

            if (_httpContextAccessor.HttpContext.Request.Path.ToString().ToUpper().Contains(nameIdentifier.ToUpper()))
            {
                context.Succeed(requirement);
            }
            else
            {
                context.Fail();
            }



            return Task.CompletedTask;
        }
    }

需求

public class SelfUserRequirement : IAuthorizationRequirement
    {
        public SelfUserRequirement() { }
    }

其他信息:Nate Barbettini 在這里回答Joe Audette 在這里回答

首先,當您的代碼針對該策略進行驗證時,該策略將不了解並且不需要知道您在做什么。

我想您可以通過URL檢索上下文。 所以說,如果它是一個DELETE用戶/ 3

那么您可以創建一個策略來檢查用戶聲稱ID == 3的聲明。

請參閱此處的有關創建策略和訪問httpContext的文檔

https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies?view=aspnetcore-2.2

這有點天真,我寧願將邏輯放在控制器的方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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