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】:

POSTing 和content-type 未指定时,我看到了很多问题。

Invoke-RestMethod -Method Post -Uri "http://localhost:5000/api/somemethod" -Headers $headers -Body $data -ContentType "application/json"

或任何content-type 你是POSTing。

【讨论】:

感谢您的回复 - 没有通过正文添加内容。 API 端点用作从应用程序数据库中删除非活动用户的触发器。 -ContentType "application/json" 无效。

以上是关于API 端点授权不能通过 Powershell 脚本工作的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应

通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户

是否可以添加使用 WooCommerce 授权的新 API 端点?

无法使用服务帐户授权连接到自己的 GAE 端点 API

如何在没有授权人的情况下通过 API Gateway 使 AWS Cognito 用户数据可供 Lambda 使用?

无法让 Identity Server 4 API 授权其自己的端点,而是发送登录页面