客户端与用户身份验证调用的类似 API 的最佳做法是什么

What's the best practice for a similar API called by Client vs User authentication

在您想从 api 获取用户信息的情况下,您可能作为用户(最终用户)令牌或客户端(拥有的服务)令牌进行调用,最好是有单独的端点,还是共享一个端点并在其中处理授权?

例如,在这样的事情之间:

        [HttpGet]
        [Authorize(Policy ="ClientAllowedToGetUserInfo")]
        [Route("userinfo/{userId}")]
        public ActionResult<UserInfo> GetUserInfo(Guid userId)
        {           
            return GetTheUserInfo(userId);
        }
        
        [HttpGet]
        [Authorize(Policy ="UserCheckingOwnUserInfo")]
        [Route("userinfo")]
         public ActionResult<UserInfo> GetUserInfo2(Guid userId)
        {           
            return GetTheUserInfo(User.Identity.Name);
        }

或者这个:

        [HttpGet]
        [Authorize(Policy ="ClientOrUser")]
        [Route("userinfo/{userId}")]
        public ActionResult<UserInfo> GetUserInfo(Guid userId)
        {           
            if User.Claims.HasClaim("MyClientClaim") || (userId == User.Identity.Name)
            {
                return GetTheUserInfo(userId);
            }
            return Forbidden();     
        }

最佳做法是什么?

separate endpointsshare an endpoint 都可以正常工作。但它们之间有一个不同之处。当你使用separate endpoints时,如果validate失败,request不会进入action,直接在Policy中return。当您使用 share an endpoint 时,请求将进入操作并在 if(....) 中验证。所以,在我看来,我会选择separate endpoints。因为我更喜欢在策略中验证而不是在操作中验证