当前位置: 首页 > 知识库问答 >
问题:

使用windows身份验证的Asp.net核心web API-Cors请求未经授权

钱朝明
2023-03-14

在我的ASP.NET核心web api中,我已经按照MS文档中的文章配置了Cors。web api应用程序正在使用windows身份验证(未启用匿名身份验证)。创建Cor的策略,并在< code>startup.cs中添加中间件,如下所示

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.WithOrigins("http://localhost:4200")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials()
            );
    });

    services.AddMvc().AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{         
    //Enable CORS policy 
    app.UseCors("CorsPolicy");
    app.UseMvc();
}

还应用了每个控制器级别的策略

[EnableCors("CorsPolicy"), Route("api/[controller]")]
public class LocationController : BaseController<Location>
{
  //code
}

选项请求越来越未经授权。请求

我见过类似的问题,也尝试过几乎所有的解决方案,但选项请求仍然失败。

共有3个答案

焦博实
2023-03-14

使用IIS CORS模块很好地解决了这个问题。以下网址仅供参考。

使用Windows身份验证虽然这绝不是CORS模块解决的唯一场景,但它非常重要,值得调用。以前,如果您尝试向使用Windows身份验证的应用程序发出跨域请求,您的飞行前请求将失败,因为浏览器没有随飞行前请求发送凭据。如果不在应用程序中启用匿名身份验证,则无法解决此问题。由于CORS模块在身份验证之前启动,因此可以在不影响应用程序安全模型的情况下处理飞行前请求。这里有一个例子,说明你的网站是什么。配置可能看起来像这样。

https://blogs.iis.net/iisteam/getting-started-with-the-iis-cors-module

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following section. 
         For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
         <system.web>
        <authentication mode="Windows"/>
    </system.web>
  <system.webServer>
  <cors enabled="true" failUnlistedOrigins="true">
            <add origin="http://localhost:60096" allowCredentials="true" >
            <allowHeaders allowAllRequestedHeaders="true">
                    <add header="Header1" />
                </allowHeaders>
            </add>
        </cors>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\Project.Api.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
慕容星晖
2023-03-14

1) 在 launchSettings.json 文件(开发设置文件)中将“允许 Windows 和匿名身份验证”标志设置为 true。

匿名身份验证:需要允许预检选项请求。

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iis": 
      ...
}

2)在配置服务方法中添加Cors策略。

public void ConfigureServices(IServiceCollection services)
{
         
        ...
          services.AddCors(options =>
              {
                  options.AddPolicy("MyCustomCorsPolicyName",
                              builder => builder.WithOrigins("http://YourDomainName/")
                                      .AllowAnyMethod()
                                      .AllowAnyHeader()
                                      .AllowCredentials()
                              );
              });
          services.AddAuthentication(IISDefaults.AuthenticationScheme);
          services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);      
}
   

3:将CORS中间件添加到您的Web应用程序管道以允许跨域请求。

public void Configure(IApplicationBuilder app)
{
   ....
   app.UseCors("MyCustomCorsPolicyName");
   app.UseMvc();
}

4)在控制器顶部添加Authorize属性以强制,客户端发送凭据

[Authorize]
public class MyAPIController : ControllerBase
{
...
}

5) 在 JQuery 或您正在使用的任何客户端中,将具有凭据属性标志设置为 true

$.ajax({
                type: "POST",
                datatype: "json",  
                url: "YourApiUrl",              
                xhrFields: {
                    withCredentials: true
                }

这适用于我使用.net core 2.2,IIS Express和Windows身份验证的开发环境。

贲永思
2023-03-14

您可能想阅读以下线程:https://github.com/aspnet/CORS/issues/60.您可以混合匿名和NTLM,这样您的CORS预飞行就不会被拒绝(因为它们不包括Windows凭据)。IIS在NTLM身份验证到达中间件之前就处理了它,所以这可能是IIS的事情。您可能需要允许匿名CORs预飞行检查。

 类似资料:
  • 我正在开发ASP NET核心Web API,对认证方式的选择感到困惑。我曾经应用默认的Asp Net身份验证,但最近我知道了JWT。因此,我几乎像本文中一样实现了身份验证:https://stormpath.com/blog/token-authentication-asp-net-core。但是我不能理解这个JWT的好处。通过简单的Asp Net身份认证,我不关心令牌存储等,我只需要用signI

  • 我有一个JavaJSF 2,Spring 3,HiberNate 4JavaEE应用程序,它使用第三方库来验证用户。我将所需的CA证书导入到我的JVM中,将第三个库添加到项目中,并在web.xml.中配置该库从智能卡读取用户详细信息。整个设置正在工作,第三方库将用户带到主页。 以下是我的要求,以确保应用程序。 再次检查该用户是否存在于特定于应用程序的数据库中 我看了这个链接,似乎“身份验证处理过滤

  • 我正在尝试使用基本身份验证获取url。我设置用户/密码如下所示。同样的凭证在邮递员中工作。 我认为凭据设置不正确。这里怎么了?错误:

  • 我仍然对所有这些身份的东西感到困惑。 首先,我仍然不清楚角色、政策/声明之间的区别。据我所知,角色是旧的做事方式,是为了向后兼容而保留的,那么这是否意味着AspNetRoleClaims是向后兼容的一部分? 我认为我理解索赔和政策时,当将它们单独考虑时,就像政策基本上是一组必须通过的规则,并赋予更改规则的能力,而不必遍历所有代码和更改角色。 这是一个声明,基本上是一个可信的来源,为该用户提供担保(

  • 经过身份验证的请求可用于获取授权代码令牌,以访问系统中的所有者资源。 对授权端点发出的请求会导致用户身份验证,并在向授权端点发送请求时提供明确的凭据。 经过身份验证的请求包含以下参数 - response_type - 这是一个必需参数,用于将值设置为'code',用于请求授权代码。 如果授权请求中没有'response_ type'参数,则授权服务器返回错误响应。 由于无效或不匹配的重定向URI