.NET9中基于策略角色验证的包冲突

news/2025/3/3 21:47:46/文章来源:https://www.cnblogs.com/axzxs2001/p/18746226

  今天在.NET项目中,使用基于策略角色的鉴权时,遇到一个401的问题,场景如下:

  Program.cs代码如下:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;var builder = WebApplication.CreateBuilder(args);var authConfig = new AuthConfig();
builder.Configuration.Bind("AuthConfig", authConfig);
builder.Services.AddSingleton(authConfig);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opt =>
{opt.TokenValidationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(authConfig.SecurityKey)),ValidateIssuer = true,ValidIssuer = authConfig.Issuer,ValidateAudience = true,ValidAudience = authConfig.Audience,ClockSkew = TimeSpan.Zero,RequireExpirationTime = true,ValidAlgorithms = new[] { SecurityAlgorithms.HmacSha512 }};
});
builder.Services.AddAuthorization(opt =>
{opt.AddPolicy("rolevalidate", policy => policy.RequireRole("user"));
});var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();app.MapPost("/login", ([FromServices] AuthConfig config,  [FromBody] UserModel userModel) =>
{if (userModel.UserName != "gsw" || userModel.Password != "111111"){return new { result = false, message = "用户名或密码错误!", token = "" };}else{var token = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(issuer: config.Issuer,audience: config.Audience,claims: new[] {new Claim(ClaimTypes.Role, "user")},notBefore: DateTime.UtcNow,expires: DateTime.UtcNow.AddSeconds(config.Expires),signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.SecurityKey)), SecurityAlgorithms.HmacSha512)));return new { result = true, message = "", token = token };}
}).AllowAnonymous();app.MapGet("/index", () =>
{return "登录成功!";
}).RequireAuthorization("rolevalidate");app.Run();public class AuthConfig
{public string Issuer { get; set; }public string Audience { get; set; }public int Expires { get; set; }public string SecurityKey { get; set; }
}
public class UserModel
{public string UserName { get; set; }public string Password { get; set; }
}

  appsettings.json内容如下:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Information"}},"AllowedHosts": "*","AuthConfig": {"Issuer": "https://www.demo.com","Audience": "https://www.demo.com","Expires": 86400,"SecurityKey": "1234567890abcdefg1234567890abcdefg1234567890abcdefg1234567890abcdefg"}
}

  引入的Nuget包如下(Microsoft.IdentityModel.Tokens包是因为觉得可传递包比较旧,升上来的):

   测试开始,先登录,成功返回Token:

  然后访问/index,遇到了401的报错。

   一开始以为在注AddAuthentication和AddAuthorization的姿势不对,重写尝试了一段时间,总是不成功。逐渐感觉到不是这里的原因,于是想通过日志,把失败的原因找出来,方便深入分析,于是开启Microsoft.AspNetCore.Authentication.JwtBearer的日 志,在appsettings.json的LogLevel下,添加如下配置:

"Microsoft.AspNetCore.Authentication.JwtBearer": "Information"

  再次请求/index,错误日志如下:

   最后定位到可能是Microsoft.IdentityModel.Tokens的问题,于是删除安装的版本,相当于给它降级,因类可传递的版本是8.0.1。

   再次测试,正常通过!

   文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/892236.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov5预处理

1.yolov5预处理流程1.等比缩放与填充:将输入图像等比缩放到目标尺寸(如640640),并在多余部分填充灰条,保持图像的宽高比不变。这一过程也被称为“letterbox”。  2.颜色空间转换:将图像从BGR格式转换为RGB格式(OpenCV默认读取为BGR)。  3.归一化:将像素值从[0, 25…

.NET9中使用Options

选项模式在 ASP.NET Core 中使用类来提供对相关配置设置的强类型访问。通过将配置设置隔离到单独的类,应用程序遵循封装和关注点分离的原则。封装确保依赖于配置的类仅依赖于其使用的设置;关注点分离则确保应用的不同部分的设置互不依赖或耦合。此外,选项模式还提供了验证配…

Semantic Kernel:OpenAPI的Plugin

SK的插件,能让AI功能如虎添翼。Plugin能让AI与本地功能和数据互动,使AI与应用的结合,并起到了很好的粘合剂作用。怎么能让Plugin本身和功能分离呢?调用API是一个很好的办法,比如下面是一个查询订单的功能,是一个mini API项目。using System.Text.Json.Serialization;var …

Semantic Kernel:Phi-4试用

微软在去年12月12日首次展示了Phi-4模型,该模型拥有140亿参数,但表现极为强大。在多项测试中表现优异:GPQA(研究生水平问答)和MATH数学基准测试中,Phi-4的表现超过了OpenAI的GPT-4o,并超越同类顶级开源模型Qwen 2.5 - 14B和Llama 3.3 - 70B。 在美国数学竞赛AMC测试中,…

2025/3/2 【栈与队列】LeetCode232. 用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 思想:用下面的两个栈模拟队列 from collections import deque class MyQueue:def __init__(self):# in主要负责push,out主要负责popself.stackin = []self.stackout = []def push(self, x: int) -> …

Semantic Kernel:Process

Process(流程)是为实现特定业务目标而设计的步骤集合,通过提供服务或产品,为客户创造价值。每个流程由一系列有序的活动组成,这些活动共同完成一个整体目标,旨在提升效率、优化决策,并促进跨团队协作。 在Microsoft Semantic Kernel框架中,Process Framework是一种强大…

Semantic Kernel:新Agent代理

在之前的SemanticKernel中,有一篇关于Agent的文章,不过现在看来其中使用的包过时,所以这篇来更新一下。原文章如下:Semantic Kernel:Agent代理 桂素伟,公众号:桂迹Semantic Kernel:Agent代理原来项目引有的Nuget包如下,版本停留在了1.18.2,2024年9月4日   最新的Agen…

基于uniCloud开发的管理端部署

参考链接: https://doc.dcloud.net.cn/uniCloud/publish.html https://doc.dcloud.net.cn/uniCloud/hosting.html#使用 上传云函数前端网页托管勾选将编译后的资源部署到前端网页托管选项 配置自定义域名配置域名,根据提示在域名管理处添加解析将得到的cname值在域名解析出添…

UnitsNet 库简介

UnitsNet 是一个功能强大的 .NET 库,专为简化物理单位的处理而设计。它提供了丰富的单位类型及其转换功能,使开发人员能够在代码中方便地进行物理单位间的转换、计算和显示。UnitsNet 支持多种领域的物理单位,例如长度、质量、体积、温度、速度、面积等,极大地提高了开发效…

DeepSeek避坑指南:巧用提示词

前言 DeepSeek是国内AI里面的佼佼者,它开源deepseek r1大模型,不仅把AI的使用成本降了下来,同时还撼动了open AI等国际玩家的市场地位。 由于DeepSeek R1是推理模型,在某些时候输出的内容答非所问、甚至会一本正经的胡说八道。今天我们主要聊聊如何能更好的让大模型回答问题…

.NET9里WinForm更新了什么

下面是几个在.NET9中WinForm的新功能!主题Windows Forms 已初步支持暗模式,目标是在 .NET 10 中实现完整支持。应用程序的颜色模式可以设置为以下几种值:SystemColorMode.Classic—(默认)浅色模式,与之前版本的 Windows Forms 相同。 SystemColorMode.System—遵循 Windo…

2019-PTA模拟赛-L1-3 后天(三目表达式-仅代码)

签到题,无解析Code: #include<iostream> using namespace std; int main(){int d;cin >> d;int res = (d + 2) % 7 == 0 ? 7 : (d + 2) % 7;cout << res;return 0; }