在未经授权的情况下调用 RESTful api 时遇到问题?
Posted
技术标签:
【中文标题】在未经授权的情况下调用 RESTful api 时遇到问题?【英文标题】:Having problems making a call to RESTful api without authorization? 【发布时间】:2016-03-07 02:44:28 【问题描述】:我需要在没有任何授权的情况下调用 RESTful API。 API 使用自己的自定义授权。我可以使用 Postman 成功访问 API,但是从我的应用程序中,对完全相同的 URL 的调用失败并显示“访问被拒绝”。我能看到的唯一区别是 Postman 设置为“No Auth”
这是调用的代码:
var task = client.GetAsync(url)
.ContinueWith((taskwithresponse) =>
var response = taskwithresponse.Result;
var jsonString = response.Content.ReadAsStringAsync();
jsonString.Wait();
var model = JsonConvert.DeserializeObject<object>(jsonString.Result).ToString();
);
task.Wait();
我已经搜索了一个多小时,但找不到任何关于此的内容。非常感谢任何帮助。
以下是 Postman 返回的标头:
Access-Control-Allow-Headers → Content-Type
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin → *
Cache-Control → no-cache
Content-Length → 70838
Content-Type → application/json; charset=utf-8
Date → Wed, 02 Dec 2015 18:10:13 GMT
Expires → -1
Persistent-Auth → false
Pragma → no-cache
Server → Microsoft-IIS/7.5
WWW-Authenticate → Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuLFrwoBSpoL7PwlX1E3MEnL7ub3KtmgZG2iGIfYqY+QyGXI1btpDaiLIBFstpQeunfY8DvHV/dcTbsVSeGW/ciuM/aZi1nG2AfHjlu6neYlTJTASF2bGv/M1EKkZRDvRoND2uLbfGdiXzrN5+M3U=
X-AspNet-Version →
X-AspNet-Version
Custom header
4.0.30319
X-Powered-By → ASP.NET
X-UA-Compatible → IE=edge
没有从 Postman 发送任何标题。
【问题讨论】:
你使用的是HttpClient还是RestSharpClient? 我正在使用 HttpClient 你能分享 Postman 的 HTTP 标头吗? 我刚刚将标题添加到原始问题中。 看起来您正在使用 Kerberos 在公司休息服务上进行身份验证。您只需要在 HttpClient 上打开 UseDefaultCredentials。请注意,在 prod 中,该服务还需要在授权使用此 rest 服务的服务帐户下运行。 【参考方案1】:看起来其余服务正在使用 NTLM 或 Kerberos 安全令牌进行身份验证。 Postman 正在自动发送 windows 身份信息。通过 C# 代码,您必须明确指定 Windows 身份作为身份令牌以进行模拟。
尝试WebClient
而不是HttpClient
并使用默认值:
var wi = (WindowsIdentity)HttpContext.User.Identity;
var wic = wi.Impersonate();
using (var client = new WebClient UseDefaultCredentials = true )
client.DownloadStringAsync(url);
wic.Undo();
如果Async
不起作用,请尝试同步方法DownloadString
。
更多详情请见source。
【讨论】:
Async 方法不起作用,但 Sync 方法起作用。哇哦! 那是因为线程安全上下文。当前线程知道在代码中完成的身份模拟,但新线程不知道。干杯!!以上是关于在未经授权的情况下调用 RESTful api 时遇到问题?的主要内容,如果未能解决你的问题,请参考以下文章
从 curl 使用 Auth0 调用 Laravel 5.3 API 时未经授权的用户
如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API