如何使用 WebClient 对 IIS WebAPI 进行基本身份验证调用?

How do I use WebClient to make Basic Authentication calls to IIS WebAPI?

使用 PowerShell Cmdlet 封装对 WebAPIWebClient 调用,我正在尝试实施基本身份验证。我尝试了几种方法并决定按照此处 WebAPI Authentication Filter.

的建议向 WebAPI 添加过滤器

仅供参考:由于这是一个 file-upload 工具,我希望数据只发送一次,因为文件将达到 10MB 的文本日志,因此我正在创建 header第一次接触。

来自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,并且在调试器中没有回显。

运行 带有凭据和 header 注释掉的代码创建了来自 Fiddler 的两条消息,一条是未经授权的,另一条是经过授权的。两者都被 401 拒绝,但是 WebAPI Controller 上的调试器显示我只是第一次尝试授权,第二次尝试使用编码授权 [=45] 正确形成=] 但在没有命中调试器的情况下被代码 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>

什么阻止了具有凭据的请求?

看看这个:https://msdn.microsoft.com/en-us/library/aa292114(v=vs.71).aspx 这就是我对IIS 身份验证的理解。无论如何我都不是权威,但我会告诉我如何使用它以及它如何为我工作。基本上IIS上的认证告诉网站如何处理客户端和服务器之间的握手,但它们都使用windows权限。 (即使匿名也要求用户使用 IIS 默认用户帐户或具有访问该站点权限的帐户)。
有 ASP.NET 身份验证,您可以使用 Windows 或表单。当我想从数据库而不是活动目录中验证用户时,我在 IIS 中使用匿名身份验证并在 web.config 中使用表单身份验证。凭据通过登录表单或查询字符串传入。 我最近一直在使用 ASP.Net 身份。它几乎完成了所有的管道工作,而且非常容易安装。 https://blogs.msdn.microsoft.com/webdev/2013/10/20/building-a-simple-todo-application-with-asp-net-identity-and-associating-users-with-todoes/ 这方面当然有很多东西。