Web API 2,CORS、NTLM 和 OWIN / Katana Angular 2
Web API 2, CORS, NTLM & OWIN / Katana with Angular 2
大量的问题让它工作。
以为我会提出常见问题和解决方案,但在这上面浪费了一天时间,并被其他答案误导了很多错误的道路。
设置:
- Web Api 2 服务器
- 为 NTLM 配置的服务器(协商)
- Angular 网站托管在不同的机器或端口
- 网站连接到 API 来做一些事情。
问题:
- 基本设置和第一次 运行 你会得到
no access-control-allow-origin header is present
- 在服务器上设置 Cors,问题仍然存在
- 您最终意识到 Angular 未在其调用中设置
WithCredentials
并修复此问题,现在 GET
可以正常工作,但 PUT
、POST
& DELETE
因飞行前的一些事情而失败。
以及解决方案:
首先,您的服务器需要启用 cors,这必须是您应用配置中的第一行:
WebApp.Start(_configuration.Url, app =>
{
app.UseCors(CorsOptions.AllowAll);
- 启用身份验证,但不适用于飞行前
OPTIONS
调用:
var listener = (HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = request =>
request.HttpMethod == "OPTIONS"
? AuthenticationSchemes.Anonymous
: AuthenticationSchemes.Negotiate;
设置您的 Angular 代码以通过 WithCredentials
发送呼叫。有很多不同的方法可以做到这一点,但我们使用了身份验证拦截器:
intercept(request: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
const authReq = request.clone({ withCredentials: true });
return next.handle(authReq)
如果您想为您的 Auth 做任何花哨的事情,您可以通过扩展 OwinMiddleware
并覆盖 Invoke
方法来创建自己的中间件。然后可以在您的 override
方法中使用 app.Use<MyMiddleware>(paramsToConstructor)
在管道中注册,您可以使用 :
访问用户的身份
var identity = new ClaimsIdentity(context.Authentication.User.Identity.AuthenticationType);
大量的问题让它工作。
以为我会提出常见问题和解决方案,但在这上面浪费了一天时间,并被其他答案误导了很多错误的道路。
设置:
- Web Api 2 服务器
- 为 NTLM 配置的服务器(协商)
- Angular 网站托管在不同的机器或端口
- 网站连接到 API 来做一些事情。
问题:
- 基本设置和第一次 运行 你会得到
no access-control-allow-origin header is present
- 在服务器上设置 Cors,问题仍然存在
- 您最终意识到 Angular 未在其调用中设置
WithCredentials
并修复此问题,现在GET
可以正常工作,但PUT
、POST
&DELETE
因飞行前的一些事情而失败。
以及解决方案:
首先,您的服务器需要启用 cors,这必须是您应用配置中的第一行:
WebApp.Start(_configuration.Url, app => { app.UseCors(CorsOptions.AllowAll);
- 启用身份验证,但不适用于飞行前
OPTIONS
调用:
var listener = (HttpListener)app.Properties["System.Net.HttpListener"]; listener.AuthenticationSchemeSelectorDelegate = request => request.HttpMethod == "OPTIONS" ? AuthenticationSchemes.Anonymous : AuthenticationSchemes.Negotiate;
设置您的 Angular 代码以通过
WithCredentials
发送呼叫。有很多不同的方法可以做到这一点,但我们使用了身份验证拦截器:intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const authReq = request.clone({ withCredentials: true }); return next.handle(authReq)
如果您想为您的 Auth 做任何花哨的事情,您可以通过扩展
OwinMiddleware
并覆盖Invoke
方法来创建自己的中间件。然后可以在您的override
方法中使用app.Use<MyMiddleware>(paramsToConstructor)
在管道中注册,您可以使用 : 访问用户的身份
var identity = new ClaimsIdentity(context.Authentication.User.Identity.AuthenticationType);
- 启用身份验证,但不适用于飞行前