请求客户端总是在发送承载令牌Angularjs Webapi2时发送方法选项

时间:2017-02-22 21:11:50

标签: c# angularjs rest asp.net-web-api2 bearer-token

你好我已经用C#中的WebAPI 2制作了一个API,我已经在api中启用了CORS并进行了令牌认证,例如,我几乎可以做任何请求。

我有一个控制器用于测试并且有这个

  root@davide:/var/www/html/wordpress# ls -l
        total 168
        -rwxrwxrwx 1 vagrant vagrant   418 Sep 25  2013 index.php
        -rwxrwxrwx 1 vagrant vagrant 19935 Jan  2 18:51 license.txt
        -rwxrwxrwx 1 vagrant vagrant  7433 Jan 11 17:46 readme.html
        -rwxrwxrwx 1 vagrant vagrant  5447 Sep 27 21:36 wp-activate.php
        drwxr-xr-x 1 vagrant vagrant  3060 Feb 21 20:09 wp-admin
        -rwxrwxrwx 1 vagrant vagrant   364 Dec 19  2015 wp-blog-header.php
        -rwxrwxrwx 1 vagrant vagrant  1627 Aug 29 12:00 wp-comments-post.php
        -rwxrwxrwx 1 vagrant vagrant  2832 Feb 21 20:09 wp-config.php
        drwxr-xr-x 1 vagrant vagrant   238 Feb 21 20:12 wp-content
        -rwxrwxrwx 1 vagrant vagrant  3286 May 24  2015 wp-cron.php
        drwxr-xr-x 1 vagrant vagrant  6392 Feb 21 20:09 wp-includes
        -rwxrwxrwx 1 vagrant vagrant  2422 Nov 21 02:46 wp-links-opml.php
        -rwxrwxrwx 1 vagrant vagrant  3301 Oct 25 03:15 wp-load.php
        -rwxrwxrwx 1 vagrant vagrant 33939 Nov 21 02:46 wp-login.php
        -rwxrwxrwx 1 vagrant vagrant  8048 Jan 11 05:15 wp-mail.php
        -rwxrwxrwx 1 vagrant vagrant 16250 Nov 29 05:39 wp-settings.php
        -rwxrwxrwx 1 vagrant vagrant 29896 Oct 19 04:47 wp-signup.php
        -rwxrwxrwx 1 vagrant vagrant  4513 Oct 14 19:39 wp-trackback.php
        -rwxrwxrwx 1 vagrant vagrant  3065 Aug 31 16:31 xmlrpc.php

如果我向任何客户提出请求,如Fiddler或Advance Rest Client,使用方法GET到api / Prueba,没有令牌工作完美,而api / Prueba / 5发送持票令牌,它也会返回完美,但是当我打电话时从客户端角度来看,总是发送方法OPTIONS并拒绝承诺,我尝试从chrome和firefox尝试使用$ http,Restangular和JQuery REST Client,但总是有相同的结果。

谢谢大家。

更新

以下是Chrome中的控制台显示的内容,在Firefox中没有显示任何内容:

无法加载http://localhost:49950/api/prueba/。请求标头字段预检响应中的Access-Control-Allow-Headers不允许授权。

更新

我已经以这种方式在WebApiConfig.cs中启用了CORS:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace ApiJSON.Controllers
{
    public class PruebaController : ApiController
    {
        // GET: api/Prueba
        [AllowAnonymous]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET: api/Prueba/5
        [Authorize]
        public string Get(int id)
        {
            return "value";
        }

        // POST: api/Prueba
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/Prueba/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/Prueba/5
        public void Delete(int id)
        {
        }
    }
}

按照建议,我以这种方式在控制器中添加了EnableCors:

public static void Register(HttpConfiguration config)
        {
            config.EnableCors();

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

            var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
            config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        }

我正在Startup.cs中看到我所拥有的东西,我以这种方式使用Microsoft.Owin.Cors:

// GET: api/Prueba/5
        [Authorize]
        [EnableCors(origins:"*", headers:"*", methods:"*")]
        public string Get(int id)
        {
            return "value";
        }

也许是在干扰System.Web.Http.Cors再次感谢您的帮助。

更新

我已经发现问题了,在Global.asax我需要指定标题,这就是我把它放在工作正常的方式。

public void Configuration(IAppBuilder app)
        {

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            var myProvider = new MyAuthorizationServerProvider();
            OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = myProvider
            };
            app.UseOAuthAuthorizationServer(options);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            HttpConfiguration config = new HttpConfiguration();
            WebApiConfig.Register(config);


            //ConfigureAuth(app);
            //app.MapSignalR();
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration { };
                map.RunSignalR(hubConfiguration);
            });


        }

这是我添加的代码:

HttpContext.Current.Response.AddHeader(&#34; Access-Control-Allow-Headers&#34;,&#34;授权&#34;);

感谢您的回答,我希望它可以帮助其他人。

1 个答案:

答案 0 :(得分:0)

假设您使用的是Microsoft.AspNet.WebApi.Cors包。

您需要在控制器(或操作)上使用EnableCors属性或在config类中全局启用CORS。上面的代码中似乎缺少该属性。

这可能有助于https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api