gpt4 book ai didi

ASP.Net Web API - 授权 header 空白

转载 作者:行者123 更新时间:2023-12-04 11:28:25 25 4
gpt4 key购买 nike

我不得不使用 .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/用户名/密码等)。

现在我正在使用 ASP.Net Web API 和 MVC4 编写新的 API。我有一个奇怪的问题,找不到其他人有完全相同的问题。为了支持基本身份验证,我遵循了此处的准则:

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

一件事,我将代码放在 Application_Start() 事件中 Global.asax.cs 文件中的“ Hook 处理程序”中(我猜测没有解释)。

无论如何,如果我使用上述代码调用我的 API(已部署在 IIS 中),授权 header 始终为空,并且上述操作失败并显示 401 Unauthorized。但是,如果我使用此代码手动设置 header ,它可以正常工作 - 即授权 header 现在存在并且我能够对用户进行身份验证。
    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 的现有用户不会手动设置 header 。

阅读基本身份验证的工作原理,初始请求是匿名的,然后客户端返回 401,然后客户端再试一次。但是,如果我在我的代码中放置一个断点,它将永远不会在 Antony 的示例中再次命中代码。我期待我的断点被击中两次。

任何想法如何让这个工作?

最佳答案

你期待正确的行为。 System.Net.WebClient 不会在初始请求时自动包含 Authorization header 。它仅在受到响应正确挑战时才发送它们,据我所知,响应是 401 状态代码和正确的 WWW-Authenticate header 。见 herehere了解更多信息。

我假设您的基本身份验证处理程序没有返回 WWW-Authenticate header ,因此 WebClient 甚至从未尝试在第二个请求中发送凭据。您应该能够在 Fiddler 或类似工具中观看此内容。

如果您的处理程序做了这样的事情,您应该见证 WebClient 方法的工作:

//if is not authenticated or Authorization header is null
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var response = task.Result;
response.StatusCode = HttpStatusCode.Unauthorized;
response.Headers.Add("WWW-Authenticate", "Basic realm=\"www.whatever.com\"");
return response;
});

//else (is authenticated)
return base.SendAsync(request, cancellationToken);

正如您所注意到的,如果您在每个请求中都包含 Authorization header (就像您在替代方法中所做的那样),那么您的处理程序已经按原样工作。所以它可能就足够了——它只是不适用于 WebClient 和其他以相同方式运行的客户端。

关于ASP.Net Web API - 授权 header 空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com