我在尝试从一个使用ASP.NET的示例控制台应用程序连接到一个WebClient webapi服务(我自己正在运行)时遇到了一些问题。webapi是来自MVC4的典型示例站点:
public HttpResponseMessage Get()
{
return Request.CreateResponse(HttpStatusCode.OK, new string[] { "value1", "value2" });
}Controller使用自定义身份验证属性进行修饰:
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配置,并更改了以下内容:
<basicAuthentication enabled="true" /> (in the security section)
<add name="BasicAuthenticationModule" lockItem="false" /> (in the modules section)我遇到的问题是,即使在服务器代码被击中之前,401就会返回。我的意思是,如果我将一个断点插入Controller或属性中,它们就不会被击中。该错误的详细信息是关于IIS 401.2的通常长文本,我认为这与IIS有关,但是使用IIS而不是使用好的,我没有一个很好的GUI来修复这个问题。有人能帮忙吗?
非常感谢!
发布于 2013-06-13 11:18:26
在IIS配置中,您已经启用了基本的auth处理,因此,如果没有凭据或凭据无效,IIS将返回401。
如果希望代码执行基本的auth处理,则需要告诉IIS允许匿名访问。
从注释编辑
如果您要求IIS执行基本操作,它将根据Windows帐户检查凭据。这将在服务器代码运行之前执行,因此不会命中自定义Auth筛选器。在本例中,返回的头将是正确的,您将看到WebClient执行双重请求(一个匿名请求,一个具有凭据)。如果WebClient不使用计算机或域帐户(站点所在的文件夹具有读取权限),请求将失败。
如果你想自己做身份验证/授权,你需要告诉IIS快件不要做任何事情,然后自己做.这基本上意味着保留配置中的所有内容(在您的情况下,恢复问题中显示的配置片段)并发送正确的标头,您已经这样做了。如果您调试,您将看到身份验证筛选器被击中两次,第一次是匿名的,它将进入If并生成您的HTTP401挑战响应,第二次它将以标准基本授权头:Basic <BASE64_ENCODED_CREDENTIALS>的形式具有凭据。
https://stackoverflow.com/questions/17083527
复制相似问题