【问题标题】:Servicestack UnAuthorized未经授权的服务堆栈
【发布时间】:2020-03-13 06:19:27
【问题描述】:

我收到“远程服务器返回错误:(401) 未经授权。”使用 servicestack utils 调用远程 API 时。它需要基本身份验证或 JWT。从 PostMan 调用相同的 API 可以正常工作。

var json = $"http://localhost:5000/API/Proxy/IsValidGuidForSetupDevice?Guid=82870f2ca21148739bff0854b306415c".GetJsonFromUrl(requestFilter: webReq => { webReq.AddBasicAuth("DevAdmin", "test1"); });

如果我在浏览器窗口中使用相同的用户在下面调用。我得到一个有效的连接和一个不记名令牌。用户\通行证很好。

http://localhost:5000/auth/credentials?username=DevAdmin&password=test1&format=json

我是否在 Util 的请求过滤器中遗漏了什么?也许我应该以不同的方式调用它并使用不记名令牌?

使用 fiddler 跟踪后更新

我将代码移到了与 servicestack 服务相同的项目中的单元测试中。只是为了删除任何变量。
Fiddler 告诉我:No Proxy-Authenticate Header is present. WWW-Authenticate Header is present: Basic realm="/auth/apikey" GET http://localhost:5000/auth

原始视图

HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
DNT: 1
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://localhost:5000/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: ss-opt=perm; loginLevel=none; X-UAId=2; ss-id=XPc7ivcCrXuN5tEWwARG; ss-pid=TDeEjUiKck82foJGLGtX

玩弄它。我可以通过直接使用用户调用 URL 并通过它来登录。我得到了不记名令牌,我可以通过它。

var json = $"http://localhost:5000//auth/credentials?username=DevAdmin&password=test1".GetJsonFromUrl();
                var o = JsonObject.Parse(json);
                var token = o.Get<string>("bearerToken");
                var jsonr = $"http://localhost:5000/API/Proxy/IsValidGuidForSetupDevice?Guid=bc464658d6a640febbd53ba17c351919".GetJsonFromUrl(
                    requestFilter: webReq => { webReq.AddBearerToken(token); });

我仍然不能在一个带有身份验证标头的调用中调用它,我仍然不知道为什么。

【问题讨论】:

    标签: asp.net-core servicestack


    【解决方案1】:

    每当诊断不同客户端的 HTTP 请求之间的不同行为时,您应该使用 HTTP 数据包嗅探器(如 FiddlerWireShark)检查不同客户端之间的原始 HTTP 流量,或者如果请求是从浏览器发出的,您可以使用他们内置的 Web Network Inspector 工具。

    查看和比较原始 HTTP 请求/响应是识别请求差异的最佳方式。

    AddBasicAuth() 扩展方法允许您将 HTTP 基本身份验证添加到 Web 请求,如果您想发送 JWT 令牌,则可以改用 AddBearerToken() 方法。

    【讨论】:

    • 我正在从另一个托管服务调用我的 servicestack 服务。我错过了为什么身份验证不适用于 webReq.AddBasicAuth("DevAdmin", "test1");在经过身份验证之前,我无法获得不记名令牌。从断开连接的服务中,我无法使用 json 服务客户端,它工作正常。今天晚些时候我会看看wireshark,谢谢
    • 更新了我的问题
    • @SteveColeman 您能否为 Postman 发出的相同成功请求提供原始 HTTP 请求/响应标头,并在其下方提供 HTTP 客户端发出的原始 HTTP 请求/响应标头,以便我们可以清楚地查看和比较两个请求之间的差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多