我有一个 .net Web API 托管在使用 Windows 身份验证的远程服务器上的 IIS 7 上。我想使用 使用带有 Node 的 TypeScript 的 Angular 2 来访问 Web api。早些时候,我收到错误“对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin” header ”
我将其添加到托管应用程序的 web.config 中
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
但现在我收到未经授权的 401 错误。我已阅读有关添加以下代码以允许跨域访问的内容 - 但我不知道在 Angular 2 应用程序中的何处添加此代码以及如何编译。
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.get('/', function(req, res, next) {
// Handle the get for this route
});
app.post('/', function(req, res, next) {
// Handle the post for this route
});
这是我尝试进行 get 调用的服务示例代码
@Injectable()
export class TodoService {
todos$: Observable<Todo[]>;
private _baseUrl: string;
private _todosObserver: Observer<Todo[]>;
private _dataStore: {
todos: Todo[]
};
constructor(private _http: Http) {
//let headers: Headers = new Headers();
this._baseUrl = 'http:/SampleServer/Server/api/LoadTodo';
this.todos$ = new Observable(observer => this._todosObserver = observer).share();
this._dataStore = { todos: [] };
}
loadTodos() {
let headers: Headers = new Headers();
//headers.append('Access-Control-Allow-Origin');
headers.append('Authorization', 'Basic ' +
btoa('username:password'));
//let opts: RequestOptions = new RequestOptions();
//opts.headers = headers;
this._http.get(`${this._baseUrl}`,headers).map(response => response.json()).subscribe(data => {
this._dataStore.todos = data;
this._todosObserver.next(this._dataStore.todos);
}, error => console.log('Could not load todos.'));
}
任何解决此问题的帮助都会很棒。
最佳答案
您需要检查请求中的 Authorization
header 是否正确发送。如果您忘记导入 Headers
类,则不会发送 header :
import {Http, Headers, ...} from 'angular2/http';
另一种选择是,由于您处于预检请求(带有 Authorization
header 的 GET 方法),因此会发送 OPTIONS 请求。事实上,该请求是由浏览器透明发送的,并且凭据存在于其中。因此您不必在服务器端检查安全性。否则,您将收到 401 错误,因为服务器将无法验证请求...
有关更多详细信息,请参阅这些文章:
关于node.js - Angular 2 - 通过 Windows 身份验证使用 Restful api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36832236/