尝试使用WebClient从示例控制台应用程序连接到ASP.NET webapi服务(我自己运行)时遇到一些问题。 webapi是MVC4的典型示例站点:
public HttpResponseMessage Get()
{
return Request.CreateResponse(HttpStatusCode.OK, new string[] { "value1", "value2" });
}
Controller使用自定义Authenticate属性进行修饰:
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.Request.Headers.Authorization == null)
{
var response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
response.Headers.Add("WWW-Authenticate", "Basic realm=\"localhost\"");
actionContext.Response = response;
return;
}
}
客户端代码通常是:
var wb = WebRequest.Create("http://localhost:64921/Values");
wb.Credentials = new NetworkCredential("xxx", "xxx");
var aaa = wb.GetResponse();
Console.WriteLine(aaa);
Console.ReadLine();
现在,我知道WebClient
或WebRequest
应该在发送凭据之前等待401,这正是我在这里要做的。
毋庸置疑,上面的设置无效。我已进入IIS express配置并更改了以下内容:
<basicAuthentication enabled="true" /> (in the security section)
<add name="BasicAuthenticationModule" lockItem="false" /> (in the modules section)
我遇到的问题是,即使在服务器代码被实际命中之前,401也会返回。我的意思是,如果我在控制器或属性中插入一个断点,它们就不会被击中。错误的详细信息是关于错误401.2 的常见长文本,我认为这与IIS配置有关,但是使用IIS express而不是漂亮的IIS我没有一个很好的GUI来解决这个问题。有人可以帮忙吗?
非常感谢!
答案 0 :(得分:1)
在IIS配置中,您已启用基本身份验证处理,因此如果没有凭据或凭据无效,IIS将返回401。
如果您希望代码执行基本身份验证处理,则需要告知IIS允许匿名访问。
来自评论的编辑
如果您要求IIS执行基本身份验证,它将检查Windows帐户的凭据。这将在服务器代码运行之前执行,因此不会命中自定义身份验证过滤器。在这种情况下,返回的标头将是正确的,您将看到WebClient
执行双重请求(一个匿名,一个带凭据)。如果WebClient不使用计算机或域帐户(对站点所在的文件夹具有读取权限),则请求将失败。
如果您想自己进行身份验证/授权,您需要告诉IIS express不要进行任何身份验证然后自己完成...这基本上意味着将所有内容保留在配置中(在您恢复的情况下)问题中显示的配置部分)并发送您已经执行的正确标头。如果您进行调试,您将看到Authenticate过滤器被击中两次,第一次是匿名,它将进入if并生成您的HTTP 401 Challenge响应,第二次它将以标准Basic的形式获得凭据授权标题:Basic <BASE64_ENCODED_CREDENTIALS>