请求OWIN令牌时出现CORS错误

时间:2016-06-03 09:15:54

标签: asp.net-web-api oauth cors

我需要从web api服务器实现OWIN授权。下面是我的初创班。

[assembly: OwinStartup(typeof(SpaServerSide.MyStartUp))]

namespace SpaServerSide
{
    public class MyStartUp
    {
        public void Configuration(IAppBuilder app)
        {            
            HttpConfiguration config = new HttpConfiguration();

            app.Map("/signalr", map =>
            {
                map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                var hubConfig = new Microsoft.AspNet.SignalR.HubConfiguration { };
                map.RunSignalR(hubConfig);
            });


            app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/#")
            });


            OAuthAuthorizationServerOptions OAuthOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/Token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(5),
                Provider = new SpaServerSide.Shared.OAuthTokenServer()               
            };

            app.UseOAuthAuthorizationServer(OAuthOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            WebApiConfig.Register(config);
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseWebApi(config);

        }
    }
}

然后,我将OAuthAuthorizationServerProvider实现如下:

public class OAuthTokenServer : OAuthAuthorizationServerProvider
    {
        public ASPIdentityUserManager cusUserManager;       

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
            var user = await cusUserManager.FindAsync(context.UserName, context.Password);
            if (user == null)
            {
                context.SetError("invalid_grant", "Username and password do not match.");
                return;
            }
            var identity = await cusUserManager.CreateIdentityAsync(user, context.Options.AuthenticationType);
            context.Validated(identity);
        }

    }

之后,我在http://localhost:5587http://localhost上的客户网站上托管了网络服务器。当我尝试使用Angular JS请求令牌时,浏览器向我提出了一个CORS错误。信息如下:

  

阻止跨源请求:同源策略禁止读取   http://localhost:5587/Token处的远程资源。 (原因:CORS   标题' Access-Control-Allow-Origin'丢失)。

请告诉我任何我错过的事情。

3 个答案:

答案 0 :(得分:1)

移动线:     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

Configuration()方法的开头。

您必须在oauth中间件之前配置CORS中间件。在信号器中间件之前,如果你需要它。

答案 1 :(得分:0)

答案 2 :(得分:0)

我认为您需要在服务器端启用CORS。你可以参考这个http://enable-cors.org/server.html。点击基于您服务器的链接。

希望对你有所帮助。 :)