Web services 当Android设备发出大量请求时,WEB API 2上出现401错误
我正在开发一个Android应用程序和一个可以通信的Web服务。我的Web服务位于Web API 2中,带有令牌承载身份验证 我的问题是,当我从Android应用程序向Web服务发送太多请求(15秒内约20个请求)时,WS-responseWeb services 当Android设备发出大量请求时,WEB API 2上出现401错误,web-services,asp.net-web-api2,http-status-code-401,unauthorized,Web Services,Asp.net Web Api2,Http Status Code 401,Unauthorized,我正在开发一个Android应用程序和一个可以通信的Web服务。我的Web服务位于Web API 2中,带有令牌承载身份验证 我的问题是,当我从Android应用程序向Web服务发送太多请求(15秒内约20个请求)时,WS-response “401” : “Authorization has been denied for this request” 这只发生在生产服务器(Amen hoster)和Android设备上。例如,如果我尝试与邮递员,一切都很好。因此,它与我的生产服务器和
“401” : “Authorization has been denied for this request”
这只发生在生产服务器(Amen hoster)和Android设备上。例如,如果我尝试与邮递员,一切都很好。因此,它与我的生产服务器和/或我的android应用程序请求有关
访问Web服务的代码
URL obj = new URL(SERVEUR_URL + url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Authorization", "Bearer " + token);
con.setRequestProperty("Content-Type", "application/json");
int responseCode = con.getResponseCode();
String responseMessage = con.getResponseMessage();
Web服务上的身份验证提供程序是默认的。没有修改
来自我的Android应用程序的请求(并非每次都有效)
邮递员的请求(每次工作)
我所尝试的:
- 在本地复制此错误:它可以从android应用程序或Postman在本地服务器(web和SQL服务器)上正常工作
- 我检查每个请求中是否正确发送了令牌
- 来自Android的请求每次都是相同的
- 试图将缺少的标题添加到我的android应用程序请求中
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 691
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.5
Set-Cookie: .AspNet.Cookies=XXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
Date: Tue, 31 May 2016 16:55:39 GMT
{"access_token":"XXXX","token_type":"bearer","expires_in":1209599,"userName":"Foo",".issued":"Tue, 31 May 2016 16:55:40 GMT",".expires":"Tue, 14 Jun 2016 16:55:40 GMT"}
Fiddler和Postman保存了这个cookie,并自动将其放入对API的请求中(例如“来自Postman的请求”代码块)。当我从邮递员获取请求中删除cookie时,它不起作用(就像我的android应用程序一样)
现在,问题是:为什么WebAPI2发送cookie而不是只使用令牌?为什么令牌在第一个请求中工作得很好,而在接下来的请求中却不能正常工作 从该页面底部可以看到,您的请求似乎总是经过身份验证,但有时无法获得授权
因此,在我看来,AuthorizationFilter[Authorize]以未知的原因拒绝了您的一些请求。我建议您转储API接收的请求以及附加到令牌的声明标识。试着看看当你有一个成功的回答和当你有一个401时,他们之间是否有差异
这样,您就可以确定是您的请求格式不正确,是索赔标识不好,还是授权筛选器出于其他原因(如太多查询或其他原因)拒绝了您
祝你好运
更新1
根据您的新输入,我认为您的Web API配置为同时使用令牌和cookie身份验证
我在这里看到的是,您有两种解决方案:
1°/将返回的cookie存储在Android应用程序中,并用于下一次呼叫。在不更改所有API的情况下解决问题的最简单、最快速的方法,但您存储了一个授权cookie:它可能导致安全问题(CSRF攻击)
2°/您可以检查您的身份验证和授权筛选器如何设置为禁用cookie身份验证并仅依赖令牌身份验证:因此,它将强制所有请求和API仅使用令牌,并将防止您遭受CSRF攻击。更复杂,因为您必须深入了解web API配置
检查以下链接(抱歉,因为我没有足够的声誉,每篇文章只能发布2个以上的链接,你可以在我的答案末尾找到它们作为文本):
- ASP.net安全Web API 2.2[2]:来自底部“配置授权服务器”一章
- MSDN关于Web API安全性的文章[3]:有关Web API安全性、如何保护它和CRSF攻击的更多一般信息和技术信息
- StackOverflow.NET cookie和令牌身份验证[4]:检查David Banister的回答,我认为这正是您想要做的:只对所有API调用使用令牌
- StackOverflow授权过滤器和身份验证[5]:有关API的此类机制的更多信息
- 使用web API和401代码进行Cookie身份验证[6]:听起来像是您的实际问题,不是吗
6:brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/最后,我得到了答案: 我的Web服务在我第一次请求请求时发送一个名为“dadaproaffinity”的Cookie。此Cookie是由邮递员自动提交给以下请求的,但不是由Android HttpUrlConnection提交的。所以,我只需要这个Cookie,现在我只需要在每个带有令牌的请求上添加这个Cookie 但是:此cookie由IIS发送,而不是由我的Web服务发送!这就是为什么它可以在本地服务器上工作,但不能在生产服务器上工作。我在谷歌上搜索了这块饼干,很少有人回应。我在英语中唯一找到的是:
Technical Cookie of IIS Server hosting the site.
Need to route to the correct server session, in order to keep it active
有人有关于此IIS Cookie的更多信息吗 两个请求之间的一个显著区别是缓存控制头。你试过在你的Android请求上设置吗?嗨,elevine,谢谢你的阅读。是的,我试过使用或不使用缓存控制,没有区别。谢谢,这有助于我找到新的线索。查看我的帖子更新Hello JohnB,我已经更新了我的答案。希望对你有帮助。谢谢你的帮助,我发现了
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 691
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.5
Set-Cookie: .AspNet.Cookies=XXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
Date: Tue, 31 May 2016 16:55:39 GMT
{"access_token":"XXXX","token_type":"bearer","expires_in":1209599,"userName":"Foo",".issued":"Tue, 31 May 2016 16:55:40 GMT",".expires":"Tue, 14 Jun 2016 16:55:40 GMT"}
Technical Cookie of IIS Server hosting the site.
Need to route to the correct server session, in order to keep it active