当前位置: 首页 > news >正文

ASP.NET Core 中基于角色的授权

原文链接:https://learn.microsoft.com/zh-cn/aspnet/core/security/authorization/roles?view=aspnetcore-9.0

微软原文使用了identity标识认证,在这里为了方便了解,就不使用微软的那个了,咱们只要在创建jwt的时候,给一个角色就可以了。

 private static void Main(string[] args){var claims = new List<Claim>();claims.Add(new Claim(ClaimTypes.NameIdentifier,"1"));claims.Add(new Claim(ClaimTypes.Name, "fengleibiao"));claims.Add(new Claim(ClaimTypes.Role, "Admin"));claims.Add(new Claim(ClaimTypes.DateOfBirth, "1999-08-07"));string jwtToken = BuildToken(claims);Console.WriteLine(jwtToken);Console.ReadKey();}private static string BuildToken(IEnumerable<Claim> claims){DateTime expires = DateTime.Now.AddSeconds(86400);byte[] keyBytes = Encoding.UTF8.GetBytes("fasdfad&9045dafz222#fadpio@02326");var secKey = new SymmetricSecurityKey(keyBytes);var credentials = new SigningCredentials(secKey,SecurityAlgorithms.HmacSha256Signature);var tokenDescriptor = new JwtSecurityToken(expires: expires,signingCredentials: credentials, claims: claims);try{string sss = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);return sss;}catch (Exception ex){throw;}}

添加角色检查

基于角色的授权检查:

  • 是声明性的,指定当前用户必须是其成员才能访问请求的资源的角色。
  • 适用于控制器中的 Razor 页面、控制器或操作。
  • 不能在 页面处理程序级别应用,它们必须应用于页面。

例如,以下代码将访问权限限制为属于 AdministrationController 角色成员的用户对 Administrator 的任何操作:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{public IActionResult Index() =>Content("Administrator");
}

多个角色可以指定为逗号分隔的列表:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{public IActionResult Payslip() =>Content("HRManager || Finance");
}

仅当用户为 SalaryController 或 HRManager 角色成员时才可访问 。

应用多个属性时,访问用户必须是所有指定角色的成员。 以下示例要求用户必须同时是 和 角色的成员PowerUser

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{public IActionResult Index() =>Content("PowerUser && ControlPanelUser");
}

可以通过在操作级别应用其他角色授权属性来限制对操作的访问:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{public IActionResult SetTime() =>Content("Administrator || PowerUser");[Authorize(Roles = "Administrator")]public IActionResult ShutDown() =>Content("Administrator only");
}

前面的 ControlAllPanelController 控制器中:

  • Administrator 角色或 PowerUser 角色的成员可以访问控制器和 SetTime 操作。
  • 只有 Administrator 角色的成员才能访问 ShutDown 操作。

可以保护控制器,但允许对单个操作的匿名、未经身份验证的访问:

[Authorize]
public class Control3PanelController : Controller
{public IActionResult SetTime() =>Content("[Authorize]");[AllowAnonymous]public IActionResult Login() =>Content("[AllowAnonymous]");
}

基于 Policy 的角色检查

角色要求也可以使用 Policy 语法来表达,其中开发人员在应用程序启动时注册策略作为授权服务配置的一部分。 这通常出现在 Program.cs 文件中:

var builder = WebApplication.CreateBuilder(args);builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();builder.Services.AddAuthorization(options =>
{options.AddPolicy("RequireAdministratorRole",policy => policy.RequireRole("Administrator"));
});var app = builder.Build();if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Error");app.UseHsts();
}app.UseHttpsRedirection();
app.UseStaticFiles();app.UseAuthentication();
app.UseAuthorization();app.MapDefaultControllerRoute();
app.MapRazorPages();app.Run();

使用 Policy 属性上的 [Authorize] 属性应用策略:

[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{return View();
}

若要在某个要求中指定多个允许的角色,请将它们指定为 RequireRole 方法的参数:

var builder = WebApplication.CreateBuilder(args);builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();builder.Services.AddAuthorization(options =>
{options.AddPolicy("ElevatedRights", policy =>policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
});var app = builder.Build();

使用方式,先通过代码生成jwt  然后赋予角色,将该jwt绑定到Authorization内既可以请求后台

http://www.dtcms.com/a/389362.html

相关文章:

  • C++ 在 Windows 下实现最基础的 WebSocket 服务端与客户端
  • 并发、分布式和实时设计方法
  • C语言第15讲
  • windows 下使用 bat 批处理运行 Chrome 无头模式刷一波访问量
  • 项目名称:基于Qt框架的跨平台天气预报应用程序​​
  • 王自如重操旧业拆箱iPhone:苹果新机发售旧机发热是惯例……
  • 鸿蒙Next Core File Kit:文件管理的高效安全之道
  • Java-128 深入浅出 MySQL MyCat 分布式数据库中间件详解:架构、功能与应用场景
  • gozero使用gRPC-gateway生成http网关
  • Go语言100个实战案例-项目实战篇:股票行情数据爬虫
  • Python开发最新 PyCharm 2025使用(附详细教程)
  • 【session基础】
  • 客户流失预警中uplift建模案例、入门学习(二)
  • SSH远程管理工具
  • 4644电源芯片的介绍和使用
  • MIPI D-PHY布线规则
  • 《深入理解Java虚拟机》第四章节读书笔记:虚拟机性能监控、故障处理工具
  • ​​[硬件电路-251]:电源相关常见的专业术语
  • 日志中的SQL语句直接转为可执行的SQL
  • Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践
  • Nginx-RTMP-Module开源项目全解析:从基础部署到企业级应用实践
  • 新代系统如何输入期限密码
  • 【C++】STL--stack(栈)queue(队列)使用及其重要接口模拟实现
  • 计算机组成原理:奔腾系列机的虚存组织
  • 架构模式的双雄会:Reactor与Proactor的高并发哲学
  • 【C++】STL详解(八)—stack和queue的模拟实现
  • 【LeetCode Hot100----08-二叉树篇中(06-10),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
  • ARM(12) - ADC 检测光照强度
  • 网格生成引擎:设计原则、关键组件
  • 【开发AI】Spring AI Alibaba:集成AI应用的Java项目实战