- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
五月一眨眼就过去,就当凑个数吧.
场景:
一个小小的项目,需要一个后台,就展示几个列表,连用户表、角色表等都不需要设计.
之前有写过identityserver4和jwt4的demo 。
( exercisebook/IdentityServer4&Serilog at main · liuzhixin405/exercisebook · GitHub 。
exercisebook/授权/授权一/JwtToken at main · liuzhixin405/exercisebook · GitHub ).
但是这样一个项目中上这些肯定是大材小用.
微软提供的还有一个就是cookie,既然够简单,那么什么也不用设计,尽量做到最简单,而且后期还可以通过表设计来完善这个的后台登录模块.
首先我们要实现的就是接口代码的授权:
[Authorize] [ApiController] [Route( " [controller] " )] public class WeatherForecastController : ControllerBase { private static readonly string [] Summaries = new [] { " Freezing " , " Bracing " , " Chilly " , " Cool " , " Mild " , " Warm " , " Balmy " , " Hot " , " Sweltering " , " Scorching " }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [Authorize(Roles = " Admin " )] // 要求"Admin"角色的授权 [HttpGet(Name = " GetWeatherForecast " )] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range( 1 , 5 ).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(- 20 , 55 ), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } }
上面的特性使得WeatherForecastController接口需要权限才能访问,而GetWeatherForecast接口需要Admin角色就可以访问.
下面就通过program来配置及安全中心和授权策略:
using Microsoft.AspNetCore.Authentication.Cookies; namespace auth_cookie { /// <summary> /// 一个简单的Cookie身份验证和授权示例 /// </summary> public class Program { public static void Main( string [] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // 配置Cookie身份验证 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = " YourAuthCookie " ; // 设置Cookie的名称 options.LoginPath = " /api/Auth/Login " ; // 设置登录路径 }); // 配置授权服务 builder.Services.AddAuthorization(options => { options.AddPolicy( " RequireAdminRole " , policy => policy.RequireRole( " Admin " )); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthentication(); // 启用身份验证 app.UseAuthorization(); // 启用授权 app.MapControllers(); app.Run(); } } }
上面的代码够简单的吧,核心代码也就这几行。指定默认的scheme为cookie,写好注释。指定策略RequireAdminRole,要求角色Admin,都可以很灵活的多配置,通过数据库,配置文件等.
// 配置Cookie身份验证 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = " YourAuthCookie " ; // 设置Cookie的名称 options.LoginPath = " /api/Auth/Login " ; // 设置登录路径 }); // 配置授权服务 builder.Services.AddAuthorization(options => { options.AddPolicy( " RequireAdminRole " , policy => policy.RequireRole( " Admin " )); });
这样不算晚,还需要一个登录和登出的授权的接口,而且接口路径写好了,/api/Auth/Login 。
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; namespace auth_cookie.Controllers { [Route( " api/[controller] " )] [ApiController] public class AuthController : ControllerBase { // [HttpPost("login")] [HttpGet( " login " )] // 方便测试 public async Task<IActionResult> Login( string username, string password) { // 执行验证用户名和密码的逻辑 // 这里可以和存到数据库的用户和密码进行比对 if (username != " admin " && password != " 123456 " ) { return BadRequest( " Invalid username or password " ); } // 如果验证成功,创建身份验证Cookie var claims = new List<Claim> { new Claim(ClaimTypes.Name, username), new Claim(ClaimTypes.Role, " Admin " ) // 添加用户角色 }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties()); return Ok( " Login successful " ); } // [HttpPost("logout")] [HttpGet( " logout " )] public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return Ok( " Logout successful " ); } } }
上面的核心代码根据我们配置的做的设置,一一对应,要不然就无权访问WeatherForecastController了:
var claims = new List<Claim> { new Claim(ClaimTypes.Name, username), new Claim(ClaimTypes.Role, " Admin " ) // 添加用户角色 }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme);
下面看看效果,访问 :https://localhost:7066/WeatherForecast,会自动跳转到https://localhost:7066/api/Auth/Login?ReturnUrl=%2FWeatherForecast 。
我们指定一下用户名和密码 https://localhost:7066/api/Auth/Login?username=admin&password=123456ReturnUrl=%2FWeatherForecast 。
再来访问 https://localhost:7066/WeatherForecast 。
退出登录,https://localhost:7066/api/auth/logout 。
再来访问 。
https://localhost:7066/WeatherForecast
配合前端的后台管理,一个很简单的后台登陆就这样ok了.
源代码:
exercisebook/授权/授权三/auth_cookie at main · liuzhixin405/exercisebook · GitHub 。
最后此篇关于aspnetcore最最简单的接口权限认证的文章就讲到这里了,如果你想了解更多关于aspnetcore最最简单的接口权限认证的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 ASP.NET Core Web 应用程序,我在其中使用 swagger 使用以下内容: public void ConfigureServices(IServiceCollection ser
AspNetCore.Mvc 和 AspNetCore.Mvc.Core NuGet 包之间有什么区别? Mvc.Core 只是简单的东西,而 Mvc 是一个包罗万象的包吗?这就是我从描述中猜测的he
我有一个包含多个项目的解决方案。我想创建一个项目的Docker镜像,因此我已经通过Docker支持添加了一个Dockerfile。我添加了Dockerfile的项目已在同一级别上依赖于其他项目。当我尝
我正在尝试使用 Ajax 将类列表返回到我的 View 这是我的ajax $(document).ready(function () { debugger; $.
我已经使用过几次这个包Microsoft.AspNetCore.TestHost在我的集成测试中托管 Asp.Net Core Web API 应用程序。 使用 Asp.Net Core 2.1 包
我正在尝试使用 Ajax 将类列表返回到我的 View 这是我的ajax $(document).ready(function () { debugger; $.
SignalR 客户端有两个 nuget 包: Microsoft.AspNetCore.SignalR.Client和 Microsoft.AspNetCore.SignalR.Client.Cor
这个错误的可能原因是什么: InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.UserMana
使用 IFormFile 时,我在运行时收到此错误: Could not load type 'Microsoft.AspNetCore.Http.Internal.FormFile' from as
我正在尝试将我的 API 项目从 .net core 2.2 升级到 .net core 3.1。我在尝试进行 API 调用时遇到此异常。 "Message":"Could not load type
我在 netcoreapp3.0 Web 应用程序中使用 netstandard2.1 库。在 Startup 中添加我的服务时,出现以下错误: 'Could not load type 'Micro
我遇到以下异常: Cannot resolve parameter 'Microsoft.Extensions.Logging.ILogger logger' "At the moment (9/28
我们有使用 Swagger 的 .net core 2.1 mvc webapi 项目。 我们使用以下软件包: swashbuckle 的配置方式如下: services.AddMvcCo
我正在使用图书馆 "FluentValidation.AspNetCore": "6.4.0-beta3"在 .netcore WebApi在一个项目中。您可以在下面看到项目结构。如果我放置 Curr
怎么改Content root path在应用程序 .Net Core 3.0 ASP Blazor 上启动? 现在应用程序以输出开始 info: Microsoft.AspNetCore.DataP
我正在将 Microsoft.AspNetCore.Identity 添加到一个项目中,我得到了 InvalidOperationException: Unable to resolve servic
我有一个 Asp.Net Core 2 Mvc 项目。我目前正在尝试将数据访问分离到一个单独的项目中;但是,一旦我添加对数据访问库的引用,我就会遇到版本冲突: error NU1107: Versio
我理解的三大人生: 单例 有范围 短暂的 但我似乎找不到说明默认生命周期是多少(如果未明确定义)的文档。 最佳答案 默认情况下,注册类型的生命周期是 transient 的,即每次注入(inject)
我有一个正在泄漏线程的 ASP.NET Core 2 应用程序。我如何确定线程永不消亡的原因? 如果我在生产环境中运行该应用程序 10 分钟,IIS 开始吐出 502.3 Bad Gateway 错误
当尝试从新的DotNetCore类库导入AspNetCore MVC站点(WebApplication1)以便运行某些测试时,出现以下错误。 任何人都可以对编译器的工作原理以及为什么使用runtime
我是一名优秀的程序员,十分优秀!