我不得不使用 .NET(最初用 Ruby 编写)重写现有的 REST API。从客户端的角度来看,它必须以与旧 API 完全相同的方式工作 - 即客户端代码不需要更改。当前的 API 需要基本身份验证。因此,要调用旧 API,以下内容可以完美运行:-
var wc = new System.Net.WebClient();
var myCache = new CredentialCache();
myCache.Add(new Uri(url), "Basic", new NetworkCredential("XXX", "XXX"));
wc.Credentials = myCache;
var returnBytes = wc.DownloadData("http://xxxx");
(出于安全原因,我不得不省略真实的 URL/用户名/密码等)。
现在我正在使用带有 MVC4 的 ASP.Net Web API 编写新的 API。我有一个奇怪的问题,找不到其他人有完全相同的问题。为了支持基本身份验证,我遵循了这里的指南:
http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/
有一件事,我将代码放在 Application_Start() 事件的 Global.asax.cs 文件中的“处理程序中”(没有解释,所以我猜想)。
无论如何,如果我使用上面的代码调用我的 API(我已经在 IIS 中部署),Authorization 标头始终为空,并且上面的失败并显示 401 Unauthorized。但是,如果我使用此代码手动设置标头,它工作正常 - 即授权标头现在存在并且我能够验证用户。
private void SetBasicAuthHeader(WebClient request, String userName, String userPassword)
{
string authInfo = userName + ":" + userPassword;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers["Authorization"] = "Basic " + authInfo;
}
.......
var wc = new System.Net.WebClient();
SetBasicAuthHeader(request, "XXXX", "XXXX");
var returnBytes = wc.DownloadData("http://xxxx");
虽然这可行,但对我没有好处,因为现有 API 的现有用户不会手动设置标头。
阅读基本身份验证的工作原理,初始请求是匿名的,然后客户端返回 401,然后客户端再次尝试。但是,如果我在代码中设置断点,它将永远不会在 Antony 的示例中再次命中代码。我期待我的断点被击中两次。
有什么想法可以让它发挥作用吗?