如何使用 WebClient 对 IIS WebAPI 进行基本身份验证调用?
How do I use WebClient to make Basic Authentication calls to IIS WebAPI?
使用 PowerShell Cmdlet
封装对 WebAPI
的 WebClient
调用,我正在尝试实施基本身份验证。我尝试了几种方法并决定按照此处 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/
这方面当然有很多东西。
使用 PowerShell Cmdlet
封装对 WebAPI
的 WebClient
调用,我正在尝试实施基本身份验证。我尝试了几种方法并决定按照此处 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/
这方面当然有很多东西。