使用ASP.NET Web API进行CORS身份验证不起作用

时间:2016-11-29 15:18:02

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

我在这里阅读了很多关于这个问题的问题,很多文章和我代码中的所有内容似乎都是正确的,但仍然没有在请求中发送Access-Control-Allow-Origin,我无法通过ajax连接到我的api。 / p>

我很难弄清楚Cors发生了什么,只是拒绝工作。

我正在使用VS的调试来测试,而不是IIS。

我的代码的某些部分是下面的

的global.asax.cs:

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Startup.cs:

public void Configuration(IAppBuilder app)
{
    app.UseCors(CorsOptions.AllowAll);
    ConfigureOAuth(app);
}

WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    config.EnableCors(new EnableCorsAttribute("*", "*", "*")); // To enable it globally
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}
在Web.config中的

我有这个包括:

<system.webServer>
    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

ajax在本地html文件中调用make:

<!DOCTYPE html>
<html lang=pt>
    <head>
        <meta charset='utf-8'>
        <title>Custom Elements</title>
        <script type='text/javascript'>
            function wslogin() {
                var xhr = new XMLHttpRequest;
                xhr.open('POST', 'http://192.168.1.160:52487/token', true);
                xhr.onload = function() {
                    var obj = JSON.parse(this.response);
                }
                xhr.send('username=MyUser&password=MyPassword&grant_type=password');
            }
        </script>
    </head>
    <body>
        <button onclick="wslogin()">WSLOGIN</button>
    </body>
</html>

我收到错误:“NetworkError:400 Bad Request”以及来自firebug的警告,指出Access-Control-Allow-Origin标头不存在。

我安装了Microsoft.AspNet.Cors,Microsoft.AspNet.WebApi.Cors和Microsoft.Owin.Cors包

有人知道我在这里缺少什么吗?

非常感谢。

更新:

OAuthProvider类中的TokenEndpoint方法如下所示:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
    {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
    }

    string corsKey = "Access-Control-Allow-Origin";

    // sets additional headers
    context.Response.Headers.Remove(corsKey);
    context.Response.Headers.Add(corsKey, new string[] { "*" });

    return Task.FromResult<object>(null);
}

2 个答案:

答案 0 :(得分:0)

/token正在进行自定义响应,因此您需要更改OAuthProvider类(在配置Cookie和令牌提供程序时,您在Startup.Auth.cs中使用此类。)

在方法TokenEndpoint(OAuthTokenEndpointContext context)中,将以下代码添加到响应消息中。

// defines the key for CORS
string corsKey = "Access-Control-Allow-Origin";
 
// sets additional headers
context.Response.Headers.Remove(corsKey);
context.Response.Headers.Add(corsKey, new string[]{ "*" });
 

这将首先删除现有的CORS标头(如果存在),并将其替换为新的标头,其中*用于请求域。

/token请求现在应该包含CORS标头,浏览器不应该再抱怨了。

答案 1 :(得分:0)

Web.Config 文件的<system.webServer></system.webServer>标记内添加以下代码:

        <httpProtocol>
              <customHeaders>
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept,Authorization" />
                <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
              </customHeaders>
            </httpProtocol>

执行此操作后,请勿忘记从 WebApiConfig.cs 文件中的 Register()方法中删除以下代码:

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

从Startup类中的 Configuration()方法中删除app.UseCors(CorsOptions.AllowAll);行。

重写 OAuthProvider 类中的 TokenEndpoint()方法,如下所示:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
        {
            foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
            {
                context.AdditionalResponseParameters.Add(property.Key, property.Value);
            }

            return Task.FromResult<object>(null);
        }

希望错误将消失!! 如果没有,那么还要在 Application_Start()方法

protected void Application_BeginRequest()
        {
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
            {
                Response.Flush();
            }
        }