【发布时间】:2016-08-25 05:40:55
【问题描述】:
我有一个简单的数据资源,可以从我自己的项目中检索一个平面 json 文件。当我尝试将 url 替换为在单独域上运行的工作 API 端点时,我在 chrome 中收到 401(未经授权)错误。
设置:我有一个包含两个项目的 Visual Studio 解决方案。
1) RateAppAPI(WebAPI 项目 w/AspNet.cors)
2) RateAppClient(带有Aurelia 的ASPNET 5 模板)
3) 我有一个 平面文件 和一个 API 端点 提供相同的 json 文档。您将在代码中看到一个已注释,而另一个未注释。
- API 项目正在为我的 GetAll 路由提供服务,没有任何问题,我可以 使用邮递员到达终点,我得到了很大的结果 杰森。我已经启用并正确设置了 CORS,我已经排除了 作为一个问题。
- 我在 wwwroot 目录中有运行 Aurelia 的客户端项目 我正在使用aurelia-http-client,我将提供代码 对于,但我会告诉你,我将提供的示例适用于 使用我在目录中的平面文件没有问题 客户项目。
- 只要我将 Get() 请求指向我自己项目中的平面文件(当然),我就可以毫无问题地提取数据并使用它。只有当我将 url 切换到指向不同域上的端点时,我才会收到 401(未经授权)错误。
这是我的代码(一个 ES6 Aurelia 模块),它是数据资源:
import {inject} from "aurelia-framework";
import {HttpClient} from "aurelia-http-client";
let baseURL = "http://localhost/RateAppAPI/api/UtilZip/ByUtil/7";
//let baseURL = "../api/utilzip/utilzip.json";
@inject(HttpClient)
export class UtilZipData {
constructor(httpClient) {
this.http = httpClient;
this.http.configure(x => { x.withCredentials(); });
}
getAll() {
return this.http.get(baseURL)
.then(response => {
return response.content;
});
}
}
归根结底,我需要弄清楚如何仅使用 Windows Auth 并能够从一个域运行客户端应用程序,让我们调用该域 localhost:1234 并访问另一个域,让我们调用 API domain localhost/RatAppAPI API 将使用以下方法启用 CORS:
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://localhost:1234/", "*", "*");
config.EnableCors(cors);
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
【问题讨论】:
-
显然,关键问题是API端点授权。我不知道
windows-authentication可以进一步说明,但它不应该特定于Aurelia 或其http-client。希望此评论对像我这样发现它具有误导性的人有所帮助。 -
我只是完整地描述了我在这里所做的事情。我不确定问题出在哪里。看起来这应该可以工作,但是在某个地方(在 API 中)或在客户端应用程序中,我在我的 http get 和 API 授权访问该端点之间做错了。
-
Eric,只需将尾部正斜杠放在允许的原点中,一切都应该开始工作......
-
它正在工作,我将通过回顾和我学到的东西来更新问题。大声笑因为如果您在项目中多次启用 cors 并设置多个来源,这可能会非常棘手。
标签: javascript cors asp.net-web-api2 windows-authentication aurelia