如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]
Posted
技术标签:
【中文标题】如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]【英文标题】:How to use webapi windows authentication with angular app [duplicate] 【发布时间】:2019-12-16 04:18:02 【问题描述】:我正在构建一些将使用 .net 核心 webapi 的 Angular 应用程序。 当我使用启用匿名身份验证时它工作正常,但 Windows 身份验证失败;/ 如果托管在 iis express 或 Windows 服务器上的完整 iis 中,则没有任何问题。 还有
我向 webapi 添加了 cors 策略,我添加了 withCredentials : true 到 Angular http 调用,添加了 .AllowCredentials();到 api cors 配置 仍然出现错误
当邮递员启用 NTLM 身份验证并将我的域/用户/传递添加到其中时,api 调用很好
web api 有:
public void ConfigureServices(IServiceCollection services)
string[] HostOrigins = new string[] "http://localhost:4200", "https://localhost:4200" ;
services.AddCors(options =>
options.AddPolicy("CorsPolicy", builder =>
builder.WithOrigins(HostOrigins)
.AllowAnyHeader().AllowAnyMethod().AllowCredentials();
);
);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseHsts();
app.UseCors("CorsPolicy");
app.UseHttpsRedirection();
app.UseMvc();
在角度服务中做发布请求:
Post(endpoint: string, PostData: any, callbackF: ((data) => void) , errorF?: ((error) => void) )
return this.http.post(endpoint, PostData, withCredentials : true )
.subscribe(
(data) => callbackF(data),
(error) =>
if (errorF) errorF(error);
else
console.log('unCatch error:' + (JSON.stringify(error)));
);
以及角度组件中的实际服务调用
this.DataService.Post('http://localhost:51500/sp/ApiTest',
str1: 'asd', int1: '1', bit: 'false',
(data: any) =>
console.log(JSON.stringify(data));
);
失败了
unCatch error:"headers":"normalizedNames":,"lazyUpdate":null,"headers":,"status":0,"statusText":"Unknown Error","url":"http://localhost:51500/sp/ApiTest","ok":false,"name":"HttpErrorResponse","message":"Http failure response for http://localhost:51500/sp/ApiTest: 0 Unknown Error","error":
HTTP401: ...
(XHR)OPTIONS — http://localhost:51500/sp/ApiTest
在 Firefox 中,它还声称它是同源策略错误,但如果是这样的话 - 它在使用匿名身份验证时也应该失败?我知道 Firefox 喜欢声称 'other error' = 'cors error' ;)
如果有人遇到这样的问题,请提出建议
最好的问候!
编辑 这是我在邮递员中收到的 - 这意味着它可以工作,但我没有看到 cors 标题?没关系还是应该在那里?
【问题讨论】:
你能给我看看你的program.cs吗? 地址localhost:4200怎么用?是你的前端运行的地址吗? 是的,它是构建 Angular 应用程序时的默认服务,它是来自女巫的主机,我试图进行此 api 调用 您需要允许匿名选项请求。请参阅this 帖子。 program.cs 默认情况下我没有触及 public static void Main(string[] args) CreateWebHostBuilder(args).Build().Run();公共静态 IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup感谢 Martin Staufcik 链接 我设法让它工作了
同时启用匿名身份验证和 windows 身份验证
在 api ConfigureServices 中添加
services.AddAuthentication(IISDefaults.AuthenticationScheme);
并且在控制器中添加了 [Authorize] 属性
确实有效 这是同一个问题 - iis 返回未经授权,因为它无法执行选项请求 - 选项请求是在内部没有提供身份验证的情况下发出的。
谢谢大家!
【讨论】:
这是造成这种情况的潜在原因 - 带有选项请求的 http 握手?这对我来说有些意义 - 任何人都可以确认这可能是问题吗? ***.com/a/10820339/11305308 发生这种情况的原因是 CORS 请求在设计上没有携带凭据信息。您需要启用匿名访问,以便可以处理 CORS OPTIONS 请求。然后,您需要打开窗口以进行正常的应用程序身份验证。这是一个很棒的explanation 谢谢!现在一切都清楚了!我用谷歌搜索了很多,但之前没有找到那篇文章;p以上是关于如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Web API 的 Owin 身份验证的 Provider 类中获取 Windows 登录?
支持基本、匿名和 Windows 身份验证的 Web 服务/API
如何在 ASP.Net Web API 中为特定控制器启用 Windows 身份验证
如何在没有登录表单的情况下将摘要身份验证与 asp.net web api 和 angular js 一起使用?