2013-06-13 135 views
2

我尝试使用WebClient从示例控制台应用程序连接到ASP.NET webapi服务(我正在运行自己)时出现了一些问题。所述的WebAPI是从MVC4典型样本点:WebApi中的NetworkCredentials和授权

public HttpResponseMessage Get() 
{ 
    return Request.CreateResponse(HttpStatusCode.OK, new string[] { "value1", "value2" }); 
} 

所述控制器被饰以自定义身份验证属性:

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快递配置,改变了以下内容:

<basicAuthentication enabled="true" /> (in the security section) 
<add name="BasicAuthenticationModule" lockItem="false" /> (in the modules section) 

,我有是,401获取返回甚至前的服务器代码actualy打的问题。我的意思是,如果我将一个断点放入控制器或属性中,它们不会被击中。错误的详细信息是关于错误401.2的常见长文本,我认为这与IIS配置有关,但使用IIS Express而不是IIS,我没有一个很好的GUI来解决这个问题。谁能帮忙?

非常感谢!

回答

1

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

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

如果你问IIS

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

如果你想自己做认证/授权,你需要告诉IIS express不要做任何认证,然后自己做这一切......这基本上意味着将所有东西都留在配置中(在你的情况下恢复问题中显示的配置),并发送正确的标题,这些都已经完成。如果您进行了调试,您会看到Authenticate筛选器被击两次,第一次它将是一个匿名进入if内部并生成HTTP 401 Challenge响应,第二次它将以标准Basic形式授权标题:Basic <BASE64_ENCODED_CREDENTIALS>

+0

我该怎么做? IIS可以从哪里获得凭据有效的信息?无论如何,我必须在代码中检查这些数据库。无论如何,它是IIS在这里表达的问题,我无法找到如何获得凭据到我的代码,因为它总是发送401. – Tallmaris

+0

@Tallmaris我_believe_如果你问IIS做基本的身份验证它会检查Windows帐户。你需要告诉IIS express不要做任何认证,然后自己完成。 –

+0

@Tallmaris只要确保如果您使用的.net 4已安装4.0.3更新,或者您将无法设置www-authenticate标头。 –