.NET 6 问题:承载错误=“invalid_token”

2023-11-23

我正在使用 .NET 6 构建 API,但遇到了这个错误。我通过登录获得了一个令牌,然后将该令牌添加到标头中,但总是出现 401:未经授权的错误。

注意:我收到 Bearer error="invalid_token" 但是没有描述.

这是我的代码;

程序.cs:

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Business.DependencyResolvers.Autofac;
using Core.Utilities.Security.Encryption;
using Core.Utilities.Security.Jwt;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacBusinessModule()));

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "OzkanOner", Version = "v1" });

    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        Name = "Authorization",
        Type = SecuritySchemeType.ApiKey,
        Scheme = "Bearer",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "JWT Authorization header using the Bearer scheme."

    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement{
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            },
            new string[] {}
        }
    });
});

//CORS
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowOrigin", builder => builder.WithOrigins("http://localhost:4200"));
});

var tokenOptions = builder.Configuration.GetSection("TokenOptions").Get<TokenOptions>();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidIssuer = tokenOptions.Issuer,
        ValidAudience = tokenOptions.Audience,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = SecurityKeyHelper.CreateSecurityKey(tokenOptions.SecurityKey)
    };
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseCors(builder => builder.WithOrigins("http://localhost:4200").AllowAnyHeader());

app.UseHttpsRedirection();

// Authentication & Authorization
app.UseAuthentication();

app.UseAuthorization();

app.MapControllers();

app.Run();

JwtHelper.cs:

using Core.Entities.Concrete;
using Core.Extensions;
using Core.Utilities.Security.Encryption;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace Core.Utilities.Security.Jwt
{
    public class JwtHelper : ITokenHelper
    {
        public IConfiguration Configuration { get; }
        private TokenOptions _tokenOptions;
        private DateTime _accessTokenExpiration;
        public JwtHelper(IConfiguration configuration)
        {
            Configuration = configuration;
            _tokenOptions = Configuration.GetSection("TokenOptions").Get<TokenOptions>();

        }
        public AccessToken CreateToken(User user, List<OperationClaim> operationClaims)
        {
            _accessTokenExpiration = DateTime.Now.AddMinutes(_tokenOptions.AccessTokenExpiration);
            var securityKey = SecurityKeyHelper.CreateSecurityKey(_tokenOptions.SecurityKey);
            var signingCredentials = SigningCredentialsHelper.CreateSigningCredentials(securityKey);
            var jwt = CreateJwtSecurityToken(_tokenOptions, user, signingCredentials, operationClaims);
            var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
            var token = jwtSecurityTokenHandler.WriteToken(jwt);

            return new AccessToken
            {
                Token = token,
                Expiration = _accessTokenExpiration
            };
        }

        public JwtSecurityToken CreateJwtSecurityToken(TokenOptions tokenOptions, User user,
            SigningCredentials signingCredentials, List<OperationClaim> operationClaims)
        {
            var jwt = new JwtSecurityToken(
                issuer: tokenOptions.Issuer,
                audience: tokenOptions.Audience,
                expires: _accessTokenExpiration,
                notBefore: DateTime.Now,
                claims: SetClaims(user, operationClaims),
                signingCredentials: signingCredentials
            );
            return jwt;
        }

        private IEnumerable<Claim> SetClaims(User user, List<OperationClaim> operationClaims)
        {
            var claims = new List<Claim>();
            claims.AddNameIdentifier(user.Id.ToString());
            claims.AddEmail(user.Email);
            claims.AddName($"{user.FirstName} {user.LastName}");
            claims.AddRoles(operationClaims.Select(c => c.Name).ToArray());

            return claims;
        }
    }
}

应用程序设置.json:

{
  "TokenOptions": {
    "Audience": "https://localhost:7047",
    "Issuer": "https://localhost:7047",
    "AccessTokenExpiration": 60,
    "SecurityKey": "ASD89ays7fhHASDF09ua0sdu6d32ghbjlka"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

就我而言,我失踪了System.IdentityModel.Tokens.Jwt努吉特包。

一切都编译并运行正常,但在测试 api 时抛出无效令牌。 安装 System.IdentityModel.Tokens.Jwt 后,无需更改任何代码即可开始工作。

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

.NET 6 问题:承载错误=“invalid_token” 的相关文章

随机推荐

  • Spark-NLP 预训练管道只能在 Linux 系统上运行吗?

    我正在尝试设置一个简单的代码 在其中传递数据帧并使用 johnSnowLabs Spark NLP 库提供的预训练解释管道对其进行测试 我正在使用 anaconda 的 jupyter 笔记本 并使用 apache toree 设置 Spa
  • 在linux中定期读取性能计数器

    有没有办法在Linux中定期读取性能计数器 就像是perf stat我正在寻找能够对每个 X 周期进行采样的能力 基本上我希望能够读取某些程序的每 X 个 CPU 周期的指令计数器 执行的指令数 好消息 在下一个内核 Linux 3 9 中
  • 无法在管道中构建 .Net 5

    两周前我使用 Net 5 RC2 创建了一个新的解决方案 我已将其升级到新版本 5 0 0 我正在尝试创建一个标准的 ASP Net 管道来构建它 代理池是 Azure Pipelines 代理规范我已经尝试过 windows 2019 和
  • Javascript:函数.原型.方法

    我想大多数人都看过下面的代码片段 Function prototype method function name func this prototype name func return this 我也知道它会影响所有函数 因为它们都是由
  • 不支持链接到“Gtk.Box.new”

    我是 Vala 的新手 到目前为止我认为它很酷 但我在理解继承方面遇到了困难 我读here我应该使用base 调用父构造函数 好吧 很酷 似乎可以理解 但它对我不起作用 我一直收到标题上的错误 这是我要展示的片段 public class
  • 使用 SciPy 进行逻辑回归

    我正在尝试使用 SciPy 在 Python 中编写逻辑回归代码fmin bfgs功能 但遇到了一些问题 我为逻辑 S形 变换函数和成本函数编写了函数 这些函数工作得很好 我使用了通过固定软件找到的参数向量的优化值来测试这些函数 并且这些函
  • XPath - 如何选择节点的子元素?

    我有一个包含 XHTML 表的 XmlDocument 我想循环遍历它以一次处理一行表格单元格 但下面的代码返回嵌套循环中的所有单元格 而不仅仅是当前行的单元格 XmlNodeList tableRows xdoc SelectNodes
  • .net core 中的 httprequest.UserHostName

    在 HttpRequest 上找不到 UserHostName 属性 任何论坛上都没有任何关于它的信息 这个已经被放弃了吗 任何想法 接受的答案不正确 someHttpContext Request Host对应于HostHTTP 请求中使
  • LINQ to SQL 设计器错误

    每次我在保存后更改设计器中的值时 designer cs 文件都会被删除 谁能告诉我如何解决这个问题 Move using您的指令DataContext cs and DataContext designer cs文件到namespace
  • 如何将 AJAX 检索到的值返回到 JavaScript 中当前函数的父函数?

    我有以下 JavaScript 和 jQuery 代码 function checkEmail email if email length getJSON ajax validate email email function data if
  • Node.js:获取已安装 npm 包的(绝对)根路径

    Task 我正在寻找一种通用方法来获取 Node js 中已安装 npm 包的 绝对 根路径 Problem 我知道关于require resolve 但这会给我入口点 主模块的路径 而不是包的根路径 Take bootstrap sass
  • 获取“td”元素的 jquery 索引

    我有标记 table tr td p class que 1 Who are you p td tr tr class ans td td tr table
  • 将文件(如对象)附加到电子邮件 python 3

    我在网上找到了很多有关如何将本地文件附加到电子邮件的示例 我想做的是将一个类似对象的文件附加到电子邮件中 你为什么问 所以我不必处理清理文件的问题 下面是我的代码和我的错误 经过多次谷歌搜索后 我仍然没有设法让它工作 任何帮助将不胜感激 d
  • Chrome 扩展:如何处理浏览器的禁用和启用事件

    有没有办法在 Chrome 浏览器禁用 启用扩展程序后运行回调 Chrome 管理 API chrome management onEnabled addListener function ExtensionInfo info chrome
  • 如何在over函数中使用partition by和order by?

    我正在使用 SQL Server 2008 R2 我正在尝试编写一个显示以下内容的查询 select productname unitprice categoryid sum unitprice over partition by cate
  • php.ini 中的 pack()非法十六进制数字警告

    我在 php 中使用 pack 时遇到一些问题 currencypair EUR USD buy sell buy alert device token array a a b message Your currencypair buy s
  • 在 Windows 版 Git 中使用 GIT_SSH_COMMAND

    我现在使用的是适用于 Windows 2 x 的 Git 第四个候选版本 并在 shell 中使用 GIT SSH COMMAND 来避免 SSH 的主机验证 在 Git Bash 中我写了这样的内容 GIT SSH COMMAND ssh
  • 警告 MSB3391: 不包含任何可以为 COM 互操作取消注册的类型

    我使用 VS2005 制作了一个简单的 C DLL 这是一个更大项目的一部分 我需要通过 VBA 代码在 Excel 中使用 DLL 因此我在程序集上使用 COM Interop 我是试图让构建过程自动生成必要的TLB文件这样我就不需要在每
  • Android-从活动启动另一个应用程序[重复]

    这个问题在这里已经有答案了 我想创建一个在单击按钮时启动外部应用程序 例如 Shazam 的活动 是否可以 如何做呢 Thanks 您需要其他应用程序包名称 如果您安装了此应用程序 可以使用 adb 检查 adb shell cmd 软件包
  • .NET 6 问题:承载错误=“invalid_token”

    我正在使用 NET 6 构建 API 但遇到了这个错误 我通过登录获得了一个令牌 然后将该令牌添加到标头中 但总是出现 401 未经授权的错误 注意 我收到 Bearer error invalid token 但是没有描述 这是我的代码