API 端点授权不能通过 Powershell 脚本工作
Posted
技术标签:
【中文标题】API 端点授权不能通过 Powershell 脚本工作【英文标题】:API Endpoint Authorization does not work via Powershell Script 【发布时间】:2019-12-09 21:24:25 【问题描述】:我正在尝试编写一个简单的脚本,该脚本由我的服务器的任务调度程序通过 powershell 调用。
脚本如下所示。
$params = @
"username" = "name";
"password" = "password";
$token = Invoke-RestMethod -Method POST -Uri "http://localhost:5000/api/login" -Body ($params|ConvertTo-Json) -ContentType "application/json"
echo $token //The token gets printed correctly
$headers = @
Authorization = "Bearer " +$token
Invoke-RestMethod -Method Post -Uri "http://localhost:5000/api/somemethod" -Headers $headers
登录被完美调用 - 带有注释的somemethod
[Authorize(Roles = "admin")]
[HttpPost("somemethod/")]
public async Task<IActionResult> SomeMethod()
//Do something
return NoContent();
另一方面,得到以下控制台输出。
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 POST https:/localhost:5001/api//somemethod application/x-www-form-urlencoded 0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
Route matched with action = "SomeMethod", controller = "Api". Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] SomeMethod() on controller Api.Controllers.ApiController (Api).
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[12]
AuthenticationScheme: Bearer was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action Api.Controllers.ApiController.SomeMethod(Api) in 5.637ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 10.6572ms 401
我在这里错过了什么?
编辑:当我调试中间件时,请求按预期发送令牌。我将对此进行深入研究,如果需要,我会提供更多信息。
【问题讨论】:
$token
的格式是否正确?我假设标头需要一个简单的字符串(例如Bearer 2c7d5601...
),但很多 API 会以 JSON 格式返回令牌,您需要在使用前处理。
echo
将令牌输出为普通字符串,所以我认为它的格式正确。
"Bearer was challenged" 可能意味着访问令牌很好,但它所代表的主体(用户)没有正确的操作访问权限。您是否需要使用不同的用户名进行身份验证才能使用 somemethod 端点?
不,我没有。当我调试到我的中间件时,我可以看到用户获得了身份验证,但不知何故它以 401 结尾。我在帖子中添加了请求的屏幕。错误可能是由空的标头属性引起的吗?当我尝试添加例如 Connection = "Keep-Alive"
时,请求甚至没有到达中间件。
如果我通过 Postman 调用 API 端点,一切正常。似乎中间件出于某种原因对它们的解释不同
【参考方案1】:
当POST
ing 和content-type
未指定时,我看到了很多问题。
Invoke-RestMethod -Method Post -Uri "http://localhost:5000/api/somemethod" -Headers $headers -Body $data -ContentType "application/json"
或任何content-type
你是POST
ing。
【讨论】:
感谢您的回复 - 没有通过正文添加内容。 API 端点用作从应用程序数据库中删除非活动用户的触发器。-ContentType "application/json"
无效。以上是关于API 端点授权不能通过 Powershell 脚本工作的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应
通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户
是否可以添加使用 WooCommerce 授权的新 API 端点?