JS Fetch API无法使用具有授权属性

时间:2018-05-29 15:03:03

标签: javascript c# jquery asp.net-core asp.net-core-2.0

我在客户端有以下代码:

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版本。

1 个答案:

答案 0 :(得分:4)

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

  

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

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

Source

您的抓取现在看起来像这样:

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));