Web Api中的网络凭据和授权

时间:2013-06-13 09:23:22

标签: authentication asp.net-web-api webclient iis-express

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

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

如果您希望代码执行基本身份验证处理,则需要告知IIS允许匿名访问。

来自评论的编辑

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

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