如何在 ASP.NET Core 中使用 JWT 授权重定向到 401 登录页面

2024-03-01

我的 Startup.cs 中有这个 JWT 授权配置:

services.AddAuthentication(opts =>
{
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    opts.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opts =>
{
    opts.RequireHttpsMetadata = false;
    opts.SaveToken = true;
    opts.TokenValidationParameters = new TokenValidationParameters()
    {
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("my_secret_key")),
        ValidIssuer = "iss",
        ValidAudience = "aud",
        ValidateIssuerSigningKey = true,
        ValidateLifetime = true
    };
});

我的 HomeController 有 [Authorize] 属性。因此,在访问 Home/Index 时,我收到 401 响应,并且看到一个空白页面。我想重定向到我的帐户/登录页面,但我不知道该怎么做。

我读到这不应该自动重定向,因为如果 API 调用未经授权,然后您重定向它们,那么它对 API 调用没有意义,那么我如何让它们进入 401 登录页面的正确方法是什么?

请记住,在这个项目中,我同时拥有 Web API 和带有 [Authorize] 属性的 Action 方法,因此仅当它是 Action 方法时我才需要重定向。


您可以使用StatusCodePages 中间件 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling#configuring-status-code-pages。将以下内容添加到您的Configure方法:

app.UseStatusCodePages(async context => {
    var request = context.HttpContext.Request;
    var response = context.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.Unauthorized)   
       // you may also check requests path to do this only for specific methods       
       // && request.Path.Value.StartsWith("/specificPath")

       {
           response.Redirect("/account/login")
       }
    });

我读到这不应该自动重定向,因为它对 API 调用没有意义

这与 API 调用有关,它返回页面以外的数据。假设您的应用程序确实在后台调用 API。将操作重定向到登录页面没有帮助,因为应用程序不知道如何在没有用户参与的情况下在后台验证自身身份。

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

如何在 ASP.NET Core 中使用 JWT 授权重定向到 401 登录页面 的相关文章

随机推荐

  • iOS - 如何在我的应用程序中集成蓝牙设备

    我正在尝试创建一些连接到蓝牙设备的应用程序 一个简单的东西 比如蓝牙条形码扫描仪 可以扫描并将数字发送到我的应用程序 我想知道在我的应用程序中使用哪个框架或其他东西可以将条形码扫描仪与我的应用程序集成 是否有任何 API 或示例或教程等可以
  • 如何使用 Android 的 NDK 使用 mkfifo

    最近我升级了 NDK 现在我的应用程序因缺少符号而崩溃mkfifo E dalvikvm 2031 dlopen data app lib mylib so failed Cannot load library soinfo relocat
  • 如何使用JS获取h1标签的值?

    我有 3 个页面 其中 2 个页面是 WordPress 页面 另外 1 个是带有表单的自定义页面模板 这两个页面是使用 wp job manager 插件创建的 第一页有一个下拉菜单并包含职位列表 第二页是职位描述 现在 我想在用户单击输
  • 获取oracle中索引的完整ddl

    我使用的是 Oracle 11g 12c 我想获取数据库中索引的 ddl 为此 我使用了查询 SELECT DBMS METADATA GET DDL INDEX SYS IL0000091971C00001 CCEEXPERTS FROM
  • 我如何要求此 Django 视图使用 HTTPS?

    r login django contrib auth views login template name login html authentication form CustomAuthenticationForm 如何添加所需的 HT
  • 使 Moose 构造函数忽略 undef 参数

    哈希表是 Perl 对象的典型初始化器 现在您的输入是不可靠的 因为您不知道对于任何给定的键是否有定义的值 也不知道该键是否存在 现在 您想要将此类不可靠的输入提供给 Moose 对象 虽然缺少键完全没问题 但您确实希望摆脱未定义的值 这样
  • 平台调用语句中 DLL 的相对路径

    我正在使用 VS 2008 开发一个使用 dll 和 P Invoke 的应用程序 当我使用绝对路径时 我可以成功使用该dll 例如 这确实有效 DllImport C myDLL dll 内部静态外部布尔 isReady 这不起作用 Dl
  • 我的 openssl 和 ssl 默认 CA 证书路径是什么?

    背景 我正在尝试与外部供应商创建 SSL 上下文连接以进行握手 然后通过该连接使用 xml 进行通信 clientCert path cert path clientKey path key path PROTOCOL ssl PROTOC
  • 在组件中的“伪构造函数”与“函数 init()”中使用 CFML 代码时

    给定例如的伪构造函数在 CFML 中 component Pseudo Constructor start here comes some cfml scripting code Pseudo Constructor end functio
  • “IconDefinition”类型的参数不可分配给“IconDefinitionOrPack”类型的参数

    我在用着Angular 6 角度启动器 https github com gdi2290 angular starter和fontawesome 跟随here https github com FortAwesome angular fon
  • 并行运行多个 R 函数

    我有一个数据集 其中包含很少的数字列和超过 1 亿行的 data table 对象 我想根据其他列对某些列进行分组操作 例如 对 d 列中每个类别的 a 列的唯一元素进行计数 my data a count uniqueN col a co
  • 即使在 Monitor.Enter 之后,Monitor.TryEnter 也始终返回 true

    我想我错过了一些关于正确行为的事情Monitor Enter and Monitor TryEnter 这是我编写的一段代码 用于将问题与其余代码分开 object lockObj new object bool result Monito
  • 用于大型数据集的 sqlite 或 mysql

    我正在处理大型数据集 数十百万条记录 有时是数百百万条记录 并且想要使用与 R 良好链接的数据库程序 我正在尝试在 mysql 和 sqlite 之间做出决定 数据是静态的 但我需要做很多查询 In this 链接到 sqlite 帮助 h
  • Mongodb NoRM 和 POCO

    我正在 C 中试验 Mongodb 和 NoRM 根据我的阅读 唯一标识 Mongodb 中文档的 ObjectId 是一种 特殊 Guid 从某种意义上来说是唯一的 但其中有一些重要的部分 可以更轻松地进行排序和索引 时间戳 机器哈希 p
  • 如何处理“AES/GCM/NoPadding”的 IV 和身份验证标签?

    我在用着AES GCM NoPaddingJava 8 中的加密 我想知道我的代码是否存在安全缺陷 我的代码似乎work 因为它加密和解密文本 但一些细节尚不清楚 我的主要问题是 Cipher cipher Cipher getInstan
  • 谷歌地图 API 3 + WMS

    有人可以给我最好的主意 如何将 WMS 图层放在 Google 地图上 我有很多图层和很多样式 我在 StackOverflow 研究了很多问答 但我没有明白如何管理多种样式和图层 我想放入我的 JQuery 代码中 这里有一个很好的例子
  • CryptEncrypt 不加密整个文本

    我正在尝试使用 wincrypt 加密短信 然而我的代码是不可预测的 它不会加密 解密整个明文 而只会加密 解密其中的一部分 如果我更改密码的长度 例如更改为 password123 它会加密 解密不同数量的字符 这是我的代码 includ
  • 如何获得国家名称

    我使用下面的代码来获取文化类型列表 有没有办法只获取国家 地区名称 谢谢 static void Main string args StringBuilder sb new StringBuilder foreach CultureInfo
  • socket.gaierror: [Errno -2] Python3 未知名称或服务

    我正在尝试使用端口扫描程序 import socket import subprocess import sys from datetime import datetime subprocess call clear shell True
  • 如何在 ASP.NET Core 中使用 JWT 授权重定向到 401 登录页面

    我的 Startup cs 中有这个 JWT 授权配置 services AddAuthentication opts gt opts DefaultAuthenticateScheme JwtBearerDefaults Authenti