ASP.NET Core API 在 React 客户端调用时返回 401

2024-04-20

我正在开发一个带有 React/Redux 前端的全新 ASP.NET Core 2.1 SPA 应用程序。我已经实施了jwt从 Azure AD B2C 获取其令牌的身份验证。

当我分析对后端 API 调用的网络选项卡时,我看到令牌被放置在标头中 - 见下文:

这是我的 fetch 调用的代码:

import { fetchOptionsGet, fetchOptionsPost, parseJSON } from '../../utils/fetch/fetch-options';

export const getData = () => {

    return (dispatch) => fetch("/api/accounts/test", fetchOptionsGet())
        .then((response) => {

            if (response.ok) {

                parseJSON(response)
                    .then(result => {
                        // Do something here...
                    })
            }
        })
};

这是我的获取选项:

export const fetchOptionsGet = () => {

    const token = authentication.getAccessToken();
    debugger
    return {
        method: 'GET',
        mode: 'cors',
        headers: {
            "Content-Type": "application/json",
            "Authentication": "Bearer " + token
        }
    }
}

注意debugger在上面的代码中,以确保我获得了令牌,这确认了我拥有令牌——更不用说这也是我的网络调用。

这是ConfigureServices()中的方法Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
        services.AddAuthentication(options => {
             options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
         })
         .AddJwtBearer(jwtOptions => {
         jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
         jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
         jwtOptions.Events = new JwtBearerEvents
         {
              OnAuthenticationFailed = AuthenticationFailed
         };
     });

     services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

     // In production, the React files will be served from this directory
     services.AddSpaStaticFiles(configuration =>
     {
         configuration.RootPath = "ClientApp/build";
     });
}

这是Configure()中的方法Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }
    else
    {
       app.UseExceptionHandler("/Error");
       app.UseHsts();
    }

    app.UseHttpsRedirection();

    ScopeRead = Configuration["AzureAdB2C:ScopeRead"];
    app.UseAuthentication();

    app.UseStaticFiles();
    app.UseSpaStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });

    app.UseSpa(spa =>
    {
        spa.Options.SourcePath = "ClientApp";

        if (env.IsDevelopment())
        {
           spa.UseReactDevelopmentServer(npmScript: "start");
        }
     });
}

这是 API 控制器:

[Produces("application/json")]
[Route("api/[controller]")]
[Authorize]
public class AccountsController : Controller
{
    [HttpGet("test")]
    public async Task<IActionResult> Test()
    {
        // Do something here...
    }
}

我在开始时设置了一个断点Test()API方法,但我没有使用它。如果没有[Authorize]属性,我能够击中Test()API方法并获取我的数据。因此,在我点击 API 方法之前,管道中的某些东西就阻塞了调用。

我还尝试使用以下内容在 API 控制器中指定授权方案,但这没有任何区别。仍然收到 401 错误。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

知道我在这里犯了错误吗?


标题名称应该是Authorization.

export const fetchOptionsGet = () => {

    const token = authentication.getAccessToken();
    debugger
    return {
        method: 'GET',
        mode: 'cors',
        headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer " + token //<--
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core API 在 React 客户端调用时返回 401 的相关文章

随机推荐

  • 如何通过T-SQL在SQL Server 2008中创建计划作业?

    我想创建一个作业 在一段时间过去后从数据库中删除记录 例如我在新闻表中有一个字段Time Stamp每个月都会有一个 SQL 查询像计划作业一样针对我的数据库运行 并删除时间戳为两个月前的新闻 一般来说 我想删除两个月前或更早的新闻 以免我
  • 克隆与实例化新类

    在这种情况下 克隆是好的做法吗 怎样才能做得更好呢 public ModelCollection startParsing return parseFeed new ModelSpecialEntry public ModelCollect
  • 数据库模式混乱

    当我设计一些类时 我遇到了轻微的术语混乱 在 Sql Server 2005 中 架构 指的是数据库对象的命名空间和组织系统 但对于一般的关系数据库来说 模式 意味着表 字段等的 DDL 设计 如果我的观点是正确的 那么它解释了当我尝试阅读
  • 哪个STL容器?

    我需要一个容器 不一定是 STL 容器 它可以让我轻松执行以下操作 在任意位置插入和移除元素 通过索引访问元素 以任意顺序迭代元素 I used 标准 列表 但它不会让我在任何位置插入 确实如此 但为此我必须迭代所有元素 然后在我想要的位置
  • 将日期从 MySQL 正确导入到 R 中

    我的问题几乎相同正如这个 https stackoverflow com questions 27597932 databse connection using dplyr with date field in databse 简而言之 我
  • 在 NULL 表示为 0 的平台上,编译器是否曾经生成过 NULL <= p 的意外代码

    在 C99 中 平等 似乎从来没有未定义过 它可以产生1如果您意外地将其应用到无效地址 例如 x 1 y可能是偶然的事实 它不会产生未定义的行为 许多 但不是全部 无效地址未定义为根据标准计算 使用 因此p x with p悬空指针 或者
  • CSS 中的“缩放”有什么作用?

    我发现一些 jQuery 插件在他们的 css 规则中使用了 zoom 描述符 我什至查看了 w3c 网站 发现它是用来放大的 但我该如何实际实现它呢 或者我必须定义一些视口 我如何定义这样的视口 或者我对整个事情都错了 是否可以像这样使用
  • Blowfish 在 Java/Scala 中加密并在 bash 中解密

    我正在尝试构建一个工具来解密在 scala 应用程序中加密的 bash 内容 但首先 我必须成功地用两种语言对相同的消息进行编码并使它们相等 给定密码 0123456789abcdef 十六进制 3031323334353637383961
  • 为什么具有单个组的数据帧 groupby 不返回数据帧?

    我怀疑这是我的问题的更简单形式here https stackoverflow com questions 18518077 why does pandas groupby cut give different form of output
  • std::variant 似乎不适用于 C++ 中的shared_ptr

    通过下面的代码 我得到 In static member function static std shared ptr
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • Java中如何处理未知的protobuf字段?

    我有一个 Java 应用程序 它从另一台计算机读取一些 protobuf 数据 然后修改一些值并将其写回 用户很可能使用过时的 proto 文件读取数据 因此在这种情况下会有一些字段无法理解 我最终希望在写回所做的更改时保留未知的数据 但是
  • 是否可以反转包含循环的链表?

    我正在看一些面试问题 其中一个要求反转包含循环的链表 所以假设我有一个如下所示的链接列表 F lt E V A gt B gt C gt D 然后反转列表将创建以下内容 F gt E V A lt B lt C lt D 这里的问题是 C
  • 在不破坏寻呼机的情况下获取第一个集合项

    我之前发布了一个关于此问题的问题 但我现在有了更多信息 我认为最好发布一个新问题而不是修改 抱歉 如果这不是正确的协议 你可以找到我原来的问题here https stackoverflow com questions 6311646 ma
  • 警告: array_key_exists() 期望参数 2 为数组,给定布尔值 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有下面的代码 它检查数组中是否存在
  • 使用 R 进行快速 url 查询

    您好 必须查询网站 10000 次 我正在寻找一种真正快速的方法来使用 R 来做到这一点 作为模板网址 url lt http mutationassessor org cm var var 7 55178574 G A 我的代码是 url
  • 访问父 DOM 中的 iframe 窗口对象

    我有一个项目 其中有来自其他领域的元素 我正在使用 JavaScript 将第一个 iframe 窗口对象访问到变量中 这是代码 var iframes window frames grab first iframe var ifrWind
  • 本地数据库是否有任何选项,例如用于 j2me - CLDC 设备的 Sqlite?

    本地数据库是否有任何选项 例如用于 j2me CLDC 设备的 Sqlite PerstLite 和 OpenBaseMovil 均享有双重许可 是否有任何开源选项 或者 开发应用程序的任何替代方法 from J2ME中的数据库列表 htt
  • Android 推荐且可靠的 API 用于定期后台工作?

    我一直在使用 WorkManager 为我的应用程序创建通知 就我的目的而言 我认为PeriodicWorkRequest是最合适的 但经过一些测试和在线阅读后 它似乎非常不可靠 使用最小间隔 15 分钟 并关闭应用程序 该工作人员醒来 5
  • ASP.NET Core API 在 React 客户端调用时返回 401

    我正在开发一个带有 React Redux 前端的全新 ASP NET Core 2 1 SPA 应用程序 我已经实施了jwt从 Azure AD B2C 获取其令牌的身份验证 当我分析对后端 API 调用的网络选项卡时 我看到令牌被放置在