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

时间:2017-12-05 17:07:30

标签: angular cors owin windows-authentication webapi2

大量问题使其发挥作用。

以为我会提出常见问题和解决方案浪费了一天的时间,并通过其他答案引导了许多虚假的道路。

设置:

  1. Web Api 2服务器
  2. 为NTLM配置的服务器(协商)
  3. Angular网站托管在不同的机器或端口
  4. 网站连接到API,做好事。
  5. 问题:

    1. 基本设置,首次运行时,您会获得no access-control-allow-origin header is present
    2. 在服务器上设置Cors,但仍然会出现问题
    3. 您最终意识到Angular未在其呼叫上设置WithCredentials并修复此问题,现在GET正常工作但PUTPOST& DELETE因飞行前的问题而失败。

1 个答案:

答案 0 :(得分:0)

解决方案:

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

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

    1. 启用身份验证,但不适用于航班前OPTIONS来电:
    2. 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方法来创建自己的中间件。然后,您可以使用app.Use<MyMiddleware>(paramsToConstructor)方法在override方法中注册,然后您可以通过以下方式访问用户的身份:

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