对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。获取工作 POST PUT DELETE 不工作

2024-01-02

问候

我有一个具有以下架构的 Web 应用程序:Web api:ASP.net core 2.1(Windows 身份验证) 用户界面:角度8

UI可以获取数据但无法发送数据。 我的意思是 GET 方法工作正常,但 POST、PUT、DELETE 选项不起作用。 所有方法都可以使用 POSTMAN 来工作。

错误是:访问 XMLHttpRequest 位于 'http://xx.xxx.xxx.xx:xxyy/xxx/xxxxxx/方法 http://xx.xxx.xxx.xx:xxyy/xxx/xxxxxx/Method'从原点'http://本地主机:xxxx http://localhost:xxxx' 已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。

任何帮助将不胜感激 。

提前致谢 :)


这就是我使用的,我希望它适合你的情况。

我的startup.cs ConfigureServices() 装饰有:

services.AddCors(feature =>
                feature.AddPolicy(
                    "CorsPolicy",
                    apiPolicy => apiPolicy
                                    //.AllowAnyOrigin()
                                    //.WithOrigins("http://localhost:4200")
                                    .AllowAnyHeader()
                                    .AllowAnyMethod()
                                    .SetIsOriginAllowed(host => true)
                                    .AllowCredentials()
                                ));

并且,Configure() 方法具有:

app.UseCors("CorsPolicy");

请注意 SetIsOriginAllowed() 和 allowedCreds() 以及其他策略设置,这对我来说适用于从我的角度对我的 api 进行 POST 调用,这些角度在两个不同的端口号上运行。

UPDATE:

在评论中提出问题之后,添加有关如何检查登录用户(windows auth)btwn api 和 Angular(前端)的附加信息。

您可以检查特定路由上的传入用户,该路由仅期望使用装饰 [Authorize] 进行身份验证的用户。就我而言,我只有一种方法需要 Windows 用户在 api 中:

[HttpGet("UserInfo")]
[Authorize]
public IActionResult GetUserInfo()
{
    string defaultCxtUser = HttpContext?.User?.Identity?.Name;

    if (defaultCxtUser != null && !string.IsNullOrEmpty(defaultCxtUser))
    {
        _logger.LogDebug($"START - Get Context user details for {defaultCxtUser}");
        ADHelper.logger = _logger;
        var userFullName = ADHelper.GetUserIdentityInfo(defaultCxtUser);
        _logger.LogInformation($"Context user {defaultCxtUser} with name: {userFullName}");
        var userInfo = new { Name = userFullName };
        //_logger.LogDebug($"END - GetUserInfo({defaultCxtUser} for {userFullName}");
        return Ok(userInfo);
    }
    else
        return Ok(new { Name = defaultCxtUser });
}

然后我会从我的角度将其称为服务调用,

// Get the Logged in user info
GetCurrentUserInfo(): Observable<string> {
const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json'
  }),
  withCredentials: true
 };

// return this.http.get<string>(`${ApiPath}UserInfo`, httpOptions)
// .pipe(map(v => v as string));
return this.http.get<UserInfo>(`${ApiPath}UserInfo`, httpOptions)
.pipe(map(data => {
  // console.log(data, data.Name);
  return data.Name;
}))
;
}

请参阅带有“withCredentials: true”行的标头,该行将触发传递当前用户信息,并且只有当它具有在 C# 端读取 User.Identity 对象的授权 attr 时才会读取和理解它。我们在特定方法上执行此操作的原因是,api 中应该有一些其他父方法,例如 ApiStatus() 或任何可能的方法,应该首先调用。这将确保还使用需要匿名身份验证的选项来调用预检检查。就像我的例子一样,在从我的角度应用程序获取 userInfo() 之前,先获取 api 是否可用并正在运行,以及其他一些应用程序环境信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。获取工作 POST PUT DELETE 不工作 的相关文章

随机推荐