JS Fetch API 不适用于具有 Authorize 属性的 ASP.NET Core 2 控制器

Posted

技术标签:

【中文标题】JS Fetch API 不适用于具有 Authorize 属性的 ASP.NET Core 2 控制器【英文标题】:JS Fetch API not working with ASP.NET Core 2 Controllers with Authorize attribute 【发布时间】:2018-11-08 07:09:24 【问题描述】:

我在客户端有以下代码:

fetch("/music/index",  headers:  "Content-Type": "application/json"  )
    .then(response => 
        if (!response.ok) 
            throw response;
        
        return response.json();
    )
    .then(json => 
        console.log("Done! It's all good");
    )
    .catch(response => console.log(response));

不幸的是,这甚至没有到达MusicController(服务器端),它看起来如下(简化以说明这一点):

[Authorize]
public class MusicController : Controller 
    public async Task<IActionResult> Index()         
        IEnumerable<Song> songs = await _songsRepository.GetAll();
        return Json(songs);
    

根据我在开发者控制台中看到的内容,我被重定向到 /Account/Login?returnUrl...

同时,使用 jquery api,一切似乎都正常:

$.get("/music/index")
    .done(json => console.log("Done! It's all good"))
    .fail(error => console.log(error));

我怀疑我的标题设置不正确?不确定在网上找不到任何东西。此外,这个(或者说非常相似的)代码用于以前(非核心)版本的 ASP.NET。

【问题讨论】:

您是否尝试过添加credentials: 'include' 选项? developer.mozilla.org/en-US/docs/Web/API/Request/credentials @GetOffMyLawn 伙计,你太棒了,我什至不知道这件事 - 它奏效了。你能把它写成答案吗? @RoryMcCrossan 我在任何地方都没有$.ajaxSetup() 电话,我认为默认设置是为了让它工作。 【参考方案1】:

您需要在 fetch 中设置凭据选项,它执行以下操作:

Request 接口的 credentials 只读属性表示在跨域请求的情况下,用户代理是否应该从其他域发送 cookie。这类似于 XHR 的 withCredentials 标志,但具有三个可用值(而不是两个)

omit:永远不要发送 cookie。 same-origin:如果 URL 与调用脚本位于同一来源,则发送用户凭据(cookie、基本 http 身份验证等)。这是默认值。 include:始终发送用户凭据(cookie、基本 http 身份验证等),即使是跨域调用也是如此。

Source

您的 fetch 现在看起来像这样:

fetch("/music/index",  
  headers:  "Content-Type": "application/json" ,
  credentials: 'include'
)
  .then(response => 
      if (!response.ok) 
          throw response;
      
      return response.json();
  )
  .then(json => 
      console.log("Done! It's all good");
  )
  .catch(response => console.log(response));

【讨论】:

谢谢,我不知道我是如何在API 文档中错过的(我觉得有点愚蠢)。非常感谢。 没问题。奇怪的是same-origin 是默认值,但它似乎从来没有工作过。

以上是关于JS Fetch API 不适用于具有 Authorize 属性的 ASP.NET Core 2 控制器的主要内容,如果未能解决你的问题,请参考以下文章

React native fetch api 不适用于 localhost、IP 甚至 10.0.2.2

Fetch.lazy 不适用于 spring boot jpa,一定是啥问题?

POST 请求适用于 Postman,但不适用于 axios 或 .fetch()

为啥 localhost 不适用于节点 js api

React Native fetch 不适用于 redux?

Azure Api 规则不适用于使用具有身份验证基本和身份验证证书的默认助手