我正在尝试使用 Angular JS 为我的前端实现内置外部身份验证的 Web Api 2。我使用以下行启用了 owin cors:
app.UseCors(CorsOptions.AllowAll);
我成功地加载了外部登录,就像他们在 SPA 模板中使用这个 api 调用一样 - api/Account/ExternalLogins?returnUrl=%2F&generateState=true
当用户单击调用此 api 的按钮时,我使用响应中的 URL
htp://localhost:31683/api/Account/ExternalLogin?>provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A>31683%2F&state=EqHaUDzzuXZcVSk7IC_gWkgF5P_TNTdIHn1Tqbv18CM1
正如预期的那样,User.Identity.IsAuthenticated 尚未通过身份验证,因此它返回 ChallengeResults(与 SPA 模板完全一样),它应该将用户重定向到 facebook 登录页面。这就是我的问题所在。 Fiddler 中的响应看起来不错,它具有重定向到 facebook 登录页面的位置响应 header 。但是,当它尝试进行重定向时,我收到以下 CORS 错误:
请求的资源上不存在“Access-Control-Allow-Origin” header 。因此,不允许访问 Origin 'null'。
看起来好像我对 facebook 登录的重定向请求有一个带有空值的 Origin header 。我相信这个 Origin header 就是为什么它寻找 facebook 没有提供的 AllowCors 响应。我不确定为什么 Origin header 在重定向请求中,或者这是否就是问题所在。
下面是 chrome 响应对我的 api/Account/ExternalLogin api 的 api 调用然后重定向调用的屏幕截图。
我的 ExternalLogin 响应:
Facebook 重定向响应。这就是我认为的问题所在。请注意请求中的原始标题
任何帮助将不胜感激。我已经为此投入了很多时间。谢谢。
最佳答案
这不完全是您问题的答案,但是,我认为这可能会对您有所帮助。
我在尝试这样做时遇到了类似(或相同)的问题,但使用的是 ASP.NET MVC 5。
当不使用 CORS 时,您描述的过程就像一个魅力。我也在用。这很棒!有用。当使用 CORS 时,问题就开始了。
经过 2 天的痛苦和折磨,我从 W3C 找到了关于 CORS 的规范。 .阅读后,我的结论是不幸的是,这很简单,不可能做到这一点。看看section 6.2和 section 7.1 .
我的解决方案
在此特定操作中,我使用的是 JSONP。无需服务器端修改,无需额外代码,不再痛苦!我只需要更改一点我的角度代码。
对此
$http.jsonp('http://localhost:56278/register/appregister?provider=Facebook&?callback=JSON_CALLBACK');
由此
$http({ url: 'http://localhost:56278/register/appregister', method: 'GET', params: { provider: provider } });
预期响应
关于cors - 启用 CORS 的 Web Api 2 facebook 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23171448/