Web API 2,CORS、NTLM 和 OWIN / Katana Angular 2

Web API 2, CORS, NTLM & OWIN / Katana with Angular 2

大量的问题让它工作。

以为我会提出常见问题和解决方案,但在这上面浪费了一天时间,并被其他答案误导了很多错误的道路。

设置:

  1. Web Api 2 服务器
  2. 为 NTLM 配置的服务器(协商)
  3. Angular 网站托管在不同的机器或端口
  4. 网站连接到 API 来做一些事情。

问题:

  1. 基本设置和第一次 运行 你会得到 no access-control-allow-origin header is present
  2. 在服务器上设置 Cors,问题仍然存在
  3. 您最终意识到 Angular 未在其调用中设置 WithCredentials 并修复此问题,现在 GET 可以正常工作,但 PUTPOST & DELETE 因飞行前的一些事情而失败。

以及解决方案:

  1. 首先,您的服务器需要启用 cors,这必须是您应用配置中的第一行:

    WebApp.Start(_configuration.Url, app => { app.UseCors(CorsOptions.AllowAll);

    1. 启用身份验证,但不适用于飞行前 OPTIONS 调用:

    var listener = (HttpListener)app.Properties["System.Net.HttpListener"]; listener.AuthenticationSchemeSelectorDelegate = request => request.HttpMethod == "OPTIONS" ? AuthenticationSchemes.Anonymous : AuthenticationSchemes.Negotiate;

    1. 设置您的 Angular 代码以通过 WithCredentials 发送呼叫。有很多不同的方法可以做到这一点,但我们使用了身份验证拦截器: intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const authReq = request.clone({ withCredentials: true }); return next.handle(authReq)

    2. 如果您想为您的 Auth 做任何花哨的事情,您可以通过扩展 OwinMiddleware 并覆盖 Invoke 方法来创建自己的中间件。然后可以在您的 override 方法中使用 app.Use<MyMiddleware>(paramsToConstructor) 在管道中注册,您可以使用 :

    3. 访问用户的身份

    var identity = new ClaimsIdentity(context.Authentication.User.Identity.AuthenticationType);