0

大量的问题让这个工作。

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

设置 :

  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失败,因为一些关于飞行前的事情。
4

1 回答 1

0

和解决方案:

  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. OwinMiddleware如果您想为您的 Auth 做任何花哨的事情,您可以通过扩展和覆盖该Invoke方法来创建自己的中间件。然后可以使用app.Use<MyMiddleware>(paramsToConstructor)您的override方法在管道中注册,您可以使用以下方法访问用户的身份:

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

于 2017-12-05T17:17:48.500 回答