【发布时间】: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 端点,一切正常。似乎中间件出于某种原因对它们的解释不同
标签: rest powershell asp.net-core jwt bearer-token