在未经授权的情况下调用 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 时遇到问题?的主要内容,如果未能解决你的问题,请参考以下文章

客户端身份验证方案“匿名”的 HTTP 请求未经授权?

从 curl 使用 Auth0 调用 Laravel 5.3 API 时未经授权的用户

如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API

未经授权的 API 调用 - 安全且仅允许注册的前端应用程序

Azure 授权 - 让未经身份验证的用户调用 api

在刷新身份验证令牌时处理多个未经授权的请求