如何将 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(); 【参考方案1】:

感谢 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 一起使用?

使用 Windows 身份验证在 Web API 控制器中获取 NetworkCredential 或客户端凭据

401 未经授权的错误 web api mvc windows 身份验证