【问题标题】:Need to pass windows credentials cross domain to API需要将 Windows 凭据跨域传递给 API
【发布时间】:2014-04-04 15:10:26
【问题描述】:

我已经在 AngularJS 中实现了基于令牌的身份验证,但是我的安全 api(生成令牌)是基于窗口的,用于将所有 AD 交互集中到一个站点。

结构如下:

流程如下:

  1. 用户未登录
  2. $http 向 Windows 认证的安全 API 发出请求
  3. Security Api 用户 AD 创建令牌(由 windows auth 处理的身份验证)
  4. 令牌返回到应用程序
  5. 所有后续请求都使用令牌对经过身份验证的 API 进行令牌

当安全和应用位于同一个域时,这一切都可以正常工作,但是只要 $http 请求需要通过域,就不会发送带有 Windows 凭据的授权标头,从而导致 401。

示例请求(api 是 windows 认证的)

Security Api 通过允许 Origin 允许跨域请求(* 仅用于测试而非生产):

<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />

问题(TL:DR):

是否有可能,如果有,在发出跨域 $http 请求时如何让 AngularJS 客户端应用程序通过 Windows 凭据?

【问题讨论】:

    标签: angularjs security http asp.net-web-api token


    【解决方案1】:

    在发出 AJAX 请求时尝试将 withCredentials 属性设置为 true,以确保客户端将发送其凭据:

    $http.get(url, { withCredentials: true, ...})
    

    这个标志的作用基本上是在底层XMLHttpRequest原生对象上设置withCredentials属性。

    您还可能需要将服务器上的 Authorization 标头包含到 Access-Control-Allow-Headers 响应中。

    【讨论】:

    • 完全按预期工作,这就是我想要的!
    • 对于未来的用户,您需要在 web.config 端设置以下内容以允许这样做:
    • @Darin:授权标头将填充什么? (或者,我们如何获得该内容?)。我看到在设置 withCredentials 时,它添加了一个 WWW-Authenticate 标头——它超过了 401,给出了一个空白响应。 (这是将 CORS 设置为 '*' 允许来源、方法和标头)
    • 啊 - 就我而言,我需要添加“SupportsCredentials = true”。 IE。在 WebApiConfig 中: new EnableCorsAttribute("", "", "*") { SupportsCredentials = true };
    • 添加 withCredentials:true 后,它给了我一个弹出窗口,有没有办法在没有弹出窗口的情况下做到这一点..
    【解决方案2】:

    我的项目是一个调用 .NET Core 1.0.0 WebAPI 跨域的 Angular2-rc4 应用程序。添加到这个答案,以防它可以帮助其他人。

    我也在this线程上发布了这个。

    正如其他人所说,通过 withCredentials true:

    getUser() {
        return this.http.get(this._apiUrl + "/account/GetUser", { withCredentials: true })
            .toPromise()
            .then(response => response.json().data)
            .catch(this.handleError);
    }
    

    在您的 WebAPI 项目中,您可以在 Startup.cs(而不是 web.config)中设置 CORS 策略:

    public void ConfigureServices(IServiceCollection services)
    {
        var corsBuilder = new CorsPolicyBuilder();
        corsBuilder.AllowAnyHeader();
        corsBuilder.AllowAnyMethod();
        corsBuilder.AllowAnyOrigin();
        corsBuilder.AllowCredentials();
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAll", corsBuilder.Build());
        });
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseCors("AllowAll");
    }
    

    当然,根据您的应用需求设置您的政策,这只是允许所有测试。示例 here 和官方 .NET Core 文档 here 提供了更多详细信息。

    【讨论】:

    • 我认为 corsBuilder.AllowCredentials();和 AllowAnyOrigin() 不会一起工作。根据文档 AllowCredentials 必须允许特定的来源
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多