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

时间:2016-03-29 00:23:31

标签: c# asp.net iis asp.net-web-api webclient

使用PowerShell Cmdlet封装对WebClient的{​​{1}}调用,我正在尝试实施基本身份验证。我尝试了几种方法,并根据WebAPI Authentication Filter建议在WebAPI添加过滤器。

仅供参考:由于这是一个文件上传工具,我宁愿只发送一次数据,因为文件最多可达10MB文本日志,因此我为第一次接触创建了标题。

来自WebAPI

PowerShell Cmdlet

运行此代码会产生401,而调试器中没有回声。

使用凭据和标题注释掉运行此代码会从Fiddler创建两条消息,一条未经授权而另一条未经授权。两者都被拒绝401 但是 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没有遇到调试器。

WebAPI Controller就像我可以验证一样简单:

ApiController

此时,我必须认为授权问题是我的public class TestReportController : ApiController { [HttpPost] [McpBasicAuthenticationFilter] public async Task<string> TestConnectionPost() { dynamic message = await Request.Content.ReadAsStringAsync(); return "You sent " + message.ToString(); } } 或我的IIS设置。对于IIS,我启用了匿名和基本授权(网站的其他部分需要匿名访问)。

从我所知道的WebConfig的重要领域:

web.Config

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

1 个答案:

答案 0 :(得分:1)

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