2

我在尝试使用 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();

现在,我知道WebClientorWebRequest应该在发送凭据之前等待 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 来解决这个问题。任何人都可以帮忙吗?

非常感谢!

4

1 回答 1

1

在 IIS 配置中,您已启用基本身份验证处理,因此如果没有凭据或凭据无效,IIS 将返回 401。

如果您希望您的代码进行基本的身份验证处理,那么您需要告诉 IIS 允许匿名访问。

从评论编辑

如果您要求 IIS 进行基本身份验证,它将根据 Windows 帐户检查凭据。这将在服务器代码运行之前起作用,因此不会命中自定义身份验证过滤器。在这种情况下,返回的标头将是正确的,您将看到WebClient执行双重请求(一个匿名,一个带有凭据)。如果 WebClient 不使用计算机或域帐户(对站点所在文件夹具有读取权限),则请求将失败。

如果你想自己进行身份验证/授权,你需要告诉 IIS express 不要做任何身份验证,然后自己做这一切......这基本上意味着将所有内容保留在配置中(在你的情况下,恢复配置显示在问题中)并发送正确的标题,您已经这样做了。如果您调试,您将看到 Authenticate 过滤器被命中两次,第一次它将是匿名的,它将进入 if 并生成您的 HTTP 401 Challenge 响应,第二次它将具有标准 Basic 形式的凭据授权标头:Basic <BASE64_ENCODED_CREDENTIALS>

于 2013-06-13T11:18:26.940 回答