【问题标题】:How do I use WebClient to make Basic Authentication calls to IIS WebAPI?如何使用 WebClient 对 IIS WebAPI 进行基本身份验证调用?
【发布时间】: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


【解决方案1】:

看看这个:https://msdn.microsoft.com/en-us/library/aa292114(v=vs.71).aspx 这就是我理解 IIS 身份验证的方式。我无论如何都不是权威,但我会告诉我如何使用它以及它如何为我工作。基本上 IIS 上的身份验证告诉网站如何处理客户端和服务器之间的握手,但它们都使用 Windows 权限。 (即使是匿名用户也要求用户使用 IIS 默认用户帐户或有权访问该站点的用户帐户)。
有可以使用 Windows 或 Forms 的 ASP.NET 身份验证。当我想验证来自数据库而不是活动目录的用户时,我在 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/ 当然,这方面有很多东西。

【讨论】:

  • 稍后我将不得不看一下这个,因为我已经脱离了项目。我使用了很多带有身份的 Intranet 授权,其余的对我来说有点不同,我将不得不对此进行一些研究。如果我能从您的数据中弄清楚这一点,我肯定会将其标记为已回答,但这可能需要几周时间。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2017-06-13
  • 2013-05-30
  • 2015-08-12
  • 1970-01-01
  • 2016-07-01
  • 2013-03-25
相关资源
最近更新 更多