node.js - Angular 2 - 通过 Windows 身份验证使用 Restful api 调用

标签 node.js angular asp.net-web-api2 angular2-services

我有一个 .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/

相关文章:

javascript - 识别经过身份验证的用户的类型

主页路径下的 Angular 路由多个组件

c# - OData - 如何扩展基本实体的导航属性

asp.net - 未在发布时更新 Web API 的 XML 帮助文档

angular - 为什么这个 ngif 不能与 bool 值一起正常工作?

c# - 在 HTTP POST 中发送数组

javascript - 连接来自不同服务器的 socket.io 时出错

javascript - 属性返回未定义

javascript - Node.js 和 xlsjs 或 exceljs

javascript - 类型错误 : Cannot read property 'insertData' of undefined