从浏览器进行 API 调用有效,但不能从前端应用程序进行

Making an API call from browser works, but not from front end app

我有两个独立的项目:一个前端应用程序(Angular 2,使用 Visual Studio 代码)和一个后端应用程序(ASP.NET 核心,使用 Visual Studio 2015)。对于后端应用程序,当我执行“文件”>“新建项目”时,我选择了 "Windows Authentication."

在“属性”下,我选中了这些框:

当我从我的 浏览器 调用此 API 时,它工作正常:

        // GET: api/card
        [HttpGet]
        [Authorize(Roles = ActiveDirectory.User)]
        public Card[] Get()
        {
            var cards = _cardData.GetAll().ToList();

            var result = cards
                            .OrderByDescending(x => x.LastChanged);

            return result.ToArray();
        }

但是当我从 前端应用程序 进行调用时,我收到 401 错误:

    private _cardUrl = 'http://localhost:8462/api/card';

    getCards(): Observable<Card[]> {
        return this._http.get(this._cardUrl)
            .map((response: Response) => <Card[]>response.json())
            .catch(this.handleError);
    }

我应该指出,当我删除这一行时,它工作得很好:[Authorize(Roles = ActiveDirectory.User)]

我绝对是这个角色的成员,只是当我从前端应用程序进行调用时它无法识别它,就像我从浏览器进行调用时一样。

您的项目是否部署到不同的域? (http://localhost:8462http://localhost 被认为是不同的域)

如果是,您必须将 withCredentials: true 添加到您的 Angular2 HTTP 后端。

另请参阅:

将此添加到前端应用程序: https://github.com/angular/http/issues/65#issuecomment-181560171

将此添加到 Startup.cs 中的后端应用程序:

app.UseCors(builder =>
            builder.AllowAnyOrigin()
                    .AllowCredentials()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
            );