【发布时间】:2023-03-30 05:20:01
【问题描述】:
使用PowerShell Cmdlet 封装WebClient 对WebAPI 的调用,我正在尝试实现基本身份验证。我尝试了几种方法,并决定按照此处WebAPI Authentication Filter 的建议将过滤器添加到WebAPI。
仅供参考:由于这是一个文件上传工具,我希望数据只发送一次,因为文件将是高达 10MB 的文本日志,因此我正在为第一个联系人创建标题。
来自PowerShell Cmdlet:
private async Task<string> Run(string postBody, string Username, string Password)
{
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = Common.DefaultMediaType;
var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(Username + ":" + Password));
client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";
string response;
try
{
response = await client.UploadStringTaskAsync($"{_baseAddress}/{_uriTestConPost}", postBody);
}
catch (WebException ex)
{
var webResponse = ex.Response as HttpWebResponse;
if (webResponse == null) throw ex;
WriteWarning("WebException: " + webResponse.StatusCode);
return null;
}
return response;
}
}
按原样运行此代码会产生 401,并且在调试器中没有回显。
在注释掉凭据和标头的情况下运行此代码会创建来自 Fiddler 的两条消息,一条未经授权,另一条经授权。两者都被 401 拒绝但是WebAPI Controller 上的调试器显示我只是第一次尝试授权,第二次尝试使用编码的授权标头正确形成,但被拒绝,代码 401 没有曾经碰到过调试器。
ApiController 尽可能简单地验证:
public class TestReportController : ApiController
{
[HttpPost]
[McpBasicAuthenticationFilter]
public async Task<string> TestConnectionPost()
{
dynamic message = await Request.Content.ReadAsStringAsync();
return "You sent " + message.ToString();
}
}
此时,我不得不认为授权问题是我的web.Config 或我的IIS 设置。对于 IIS,我启用了匿名和基本授权(站点的其他部分需要匿名访问)。
据我所知,WebConfig 的重要领域:
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" executionTimeout="240000" maxRequestLength="1073741824" />
<identity impersonate="false" />
</system.web>
是什么阻止了具有凭据的请求?
【问题讨论】:
-
为什么不使用 WebClient 的 Credentials 属性,而不是添加您自己的自定义标头?
-
您检查过您的 IIS 设置吗?允许基本身份识别吗?如果可能的话,我会先从网络服务器本身访问 api,看看它是否响应。
-
@mason 使用
.Credentials = new NetworkCredential(Username, Password);会导致标准方法:发送失败的匿名请求,然后使用凭据重新发送。由于此工具最终会将大型日志文件推送到服务器(理论上最大为 180MB),因此我想避免两次发送信息。我要添加的不是自定义标头,HttpRequestHeader.Authorization是 .NET 提供的常量值。这只是手动执行WebClient中的自动化操作。 -
@HaimKatz 我已启用匿名和基本身份验证。即使关闭匿名,我也会得到 401 返回。我需要两者,因为某些网站是匿名访问。为了使它正常工作,我还需要做些什么吗?我已经阅读了一些操作指南,我相当确定我没有错过任何步骤。我很确定你是对的,这是一个 IIS 级别的问题,但我昨天刚下班就被难住了。
-
我经常使用基本身份验证。你的网络配置应该是
。 Web 应用程序所在的目录也需要您正在验证的用户的文件权限。
标签: c# asp.net iis asp.net-web-api webclient