401未经授权对CORS GET请求使用凭据进行WebApi

时间:2015-09-14 23:11:18

标签: c# asp.net-mvc asp.net-web-api cors asp.net-identity

我已经搭建了WebAPI WebApp,并使用教程here来设置CORS。一切似乎都运作良好,但当我尝试使用凭证时,它只返回一个 “401 Unauthorized”“此请求已被拒绝授权。”错误。这没有任何意义,因为Web服务和Web客户端引用相同的用户数据库(尽管他们有自己的OWIN实例,我认为)。起初我认为这可能是我使用的外部登录(谷歌)的一个问题,但基本的auth也有同样的失败。我没有使用Windows身份验证,似乎没有预检请求。

我在日志中注意到的一点是,当我尝试发送我的ajax请求时,webapi会将登录方法和用户识别为“匿名”。这显然是错误的,但我不知道为什么会这样。

这是一个示例请求标头:

GET /api/Messaging/ConnectGCSMessaging HTTP/1.1
Host: mywebservice.azurewebsites.net
Connection: keep-alive
Accept: */*
Origin: https://mywebclient.azurewebsites.net
X-FirePHP-Version: 0.0.6
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
Referer: https://mywebclient.azurewebsites.net/Admin
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: ai_user=a GUID|2015-08-26T02:16:42.468Z; ARRAffinity=S0meHexC00kietext; ai_session=a GUID|a unix timestamp|a later unix timestamp

这是响应标题:

HTTP/1.1 401 Unauthorized
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 61
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
WWW-Authenticate: Bearer
Access-Control-Allow-Origin: https://mywebclient.azurewebsites.net
Access-Control-Allow-Credentials: true
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 14 Sep 2015 21:10:37 GMT

这是我的网络客户端代码:

$.ajax({
    type: 'get',
    url:'https://mywebservice.azurewebsites.net/api/Messaging/ConnectMessaging',
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true
})

这是我的函数标题:

[EnableCors(origins: "https://mywebclient.azurewebsites.net,http://mywebclient.azurewebsites.net",
    headers: "*", methods: "*", SupportsCredentials = true)]
[Authorize]
[Route("ConnectMessaging")]
[HttpGet]
public StartupMessage ConnectMessaging()
{...

这是我的WebApiConfig.cs

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            config.EnableCors();

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

0 个答案:

没有答案