401当启用窗口身份验证启用ajax调用asp.net web api端点时发生未授权错误

问题描述:

我创建了一个简单的ASP.NET web api应用程序。我使用Microsoft.AspNet.WebApi.Cors软件包启用了CORS。401当启用窗口身份验证启用ajax调用asp.net web api端点时发生未授权错误

这是我的控制器的外观:

public class UserController : ApiController 
    { 
     [Route("user/name")] 
     [HttpGet] 
     public HttpResponseMessage GetUserName() 
     { 
      dynamic data = new ExpandoObject(); 
      data.user = HttpContext.Current.User.Identity.Name; 
      var response = JsonConvert.SerializeObject(data); 

      var msg = new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       Content = new StringContent(response) 
      }; 

      return msg; 
     } 
    } 

我只是从这个控制器返回用户ID。

我在IIS 8.5上托管了应用程序。我已禁用启用Windows身份验证的匿名身份验证&。

如果我使用rest客户端或通过在浏览器中输入URL直接访问端点,我会得到用户名。如果我使用REST客户端,我得到的响应

但如果我使用jQuery进行AJAX调用,我会得到401状态码。

$.ajax({url: 'http://serverName:8899/user/name', method: 'GET' , 
success:function(res){ 
alert('hello'); 
}}) ; 

以上调用在IE中唯一的镀铬给401错误

我怎样才能解决这个错误。我使用IIS启用Windows身份验证,我根本没有改变我的web.config。如果这是验证问题,为什么我能够在使用休息客户端时检索数据?

+0

可能重复[如何将Windows身份验证传递给使用jQuery的webservice?](http://stackoverflow.com/questions/1002179/how-can-i-pass-windows-authentication-to-webservice-using -jquery) –

我希望我能够正确回答这个问题,但我现在生病了,所以我可能会看到东西,哈哈。

但无论如何...如果您获取受限制的访问消息,您可以尝试添加一个.htaccess文件到您要发送文件的目录中。在你的.htaccess添加以下代码:

SetEnvIfNoCase X-Requested-With XMLHttpRequest ajax 
Order Deny,Allow 
Deny from all 
Allow from env=ajax 

请确保您还寄存器CORS支持无论是在全球范围内,在控制器,或在行动。

全球 - 在你WebApiConfig.cs文件从App_Start添加文件夹:

public static void Register(HttpConfiguration config) {

// New code: var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors);

// Other configurations

}

控制器行动 -如果需要/放置支持在这些级别(这将覆盖全局设置 - 行动>控制器>配置)要求。上述控制器或者动作签名:

[EnableCors(origins: "http://localhost:[port #]", headers: "*", methods: "*")]

注: *表示 “通配符”,可能想要把域发出请求例如:http://localhost:[端口#])

一些很容易遗漏/遗忘的东西...

在解决方案资源管理器中,右键单击api-project。在属性窗口设置'匿名身份验证'启用!