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内既可以请求后台