客户端与用户身份验证调用的类似 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 endpoints
和 share an endpoint
都可以正常工作。但它们之间有一个不同之处。当你使用separate endpoints
时,如果validate失败,request不会进入action,直接在Policy中return。当您使用 share an endpoint
时,请求将进入操作并在 if(....)
中验证。所以,在我看来,我会选择separate endpoints
。因为我更喜欢在策略中验证而不是在操作中验证
在您想从 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 endpoints
和 share an endpoint
都可以正常工作。但它们之间有一个不同之处。当你使用separate endpoints
时,如果validate失败,request不会进入action,直接在Policy中return。当您使用 share an endpoint
时,请求将进入操作并在 if(....)
中验证。所以,在我看来,我会选择separate endpoints
。因为我更喜欢在策略中验证而不是在操作中验证