.Net Core中如何写自定义认证实现
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天就跟大家聊聊有关.Net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、起因最近项目中需要对项目同时支持
千家信息网最后更新 2026年10月31日.Net Core中如何写自定义认证实现
今天就跟大家聊聊有关.Net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
一、起因
最近项目中需要对项目同时支持JWT认证,以及自定义的认证校验方式认证。通过对官方文档了解,得到认证实现主要通过继承 IAuthenticationHandler 或 AuthenticationHandler
那么接下来实现一个自定义的认证访问。
二、自定义认证实现
1、根据前面内容得知,处理认证通过IAuthenticationHandler 实例处理;那么首先添加一个自定义IAuthenticationHandler 类型:
////// 方式一:自定义认证处理器/// public class CustomerAuthenticationHandler : IAuthenticationHandler{ private IUserService _userService; public CustomerAuthenticationHandler(IUserService userService) { _userService = userService; } ////// 自定义认证Scheme名称 /// public const string CustomerSchemeName = "cusAuth"; private AuthenticationScheme _scheme; private HttpContext _context; ////// 认证逻辑:认证校验主要逻辑 /// ///public Task AuthenticateAsync() { AuthenticateResult result; _context.Request.Headers.TryGetValue("Authorization", out StringValues values); string valStr = values.ToString(); if (!string.IsNullOrWhiteSpace(valStr)) { //认证模拟basic认证:cusAuth YWRtaW46YWRtaW4= string[] authVal = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(valStr.Substring(CustomerSchemeName.Length + 1))).Split(':'); var loginInfo = new Dto.LoginDto() { Username = authVal[0], Password = authVal[1] }; var validVale = _userService.IsValid(loginInfo); if (!validVale) result = AuthenticateResult.Fail("未登陆"); else { var ticket = GetAuthTicket(loginInfo.Username, "admin"); result = AuthenticateResult.Success(ticket); } } else { result = AuthenticateResult.Fail("未登陆"); } return Task.FromResult(result); } /// /// 未登录时的处理 /// /// ///public Task ChallengeAsync(AuthenticationProperties properties) { _context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return Task.CompletedTask; } /// /// 权限不足时处理 /// /// ///public Task ForbidAsync(AuthenticationProperties properties) { _context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return Task.CompletedTask; } /// /// 初始化认证 /// /// /// ///public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) { _scheme = scheme; _context = context; return Task.CompletedTask; } #region 认证校验逻辑 /// /// 生成认证票据 /// /// /// ///private AuthenticationTicket GetAuthTicket(string name, string role) { var claimsIdentity = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, name), new Claim(ClaimTypes.Role, role), }, CustomerSchemeName); var principal = new ClaimsPrincipal(claimsIdentity); return new AuthenticationTicket(principal, _scheme.Name); } #endregion}/// /// 方式二:继承已实现的基类/// public class SubAuthenticationHandler : AuthenticationHandler{ public SubAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { } protected override Task HandleAuthenticateAsync() { throw new NotImplementedException(); }}
2、在Startup.cs中启用自定义认证:
public void ConfigureServices(IServiceCollection services){ //other code services.AddAuthentication(o => { x.DefaultAuthenticateScheme = CustomerAuthenticationHandler.CustomerSchemeName; x.DefaultChallengeScheme = CustomerAuthenticationHandler.CustomerSchemeName; o.AddScheme(CustomerAuthenticationHandler.CustomerSchemeName, CustomerAuthenticationHandler.CustomerSchemeName); }); //other code}public void Configure(IApplicationBuilder app){ //other code app.UseRouting(); //在UseRouting后;UseEndpoints前添加以下代码 app.UseAuthentication(); app.UseAuthorization(); //other code app.UseEndpoints()} 3、在控制器上添加认证标记,测试验证
//指定认证时,采用CustomerAuthenticationHandler.CustomerSchemeName[Authorize(AuthenticationSchemes = CustomerAuthenticationHandler.CustomerSchemeName)][Route("api/[controller]")][ApiController]public class AuditLogController : ControllerBase{ //code}调用
三、多认证支持
在实际项目中可能存在,对一个控制器支持多种认证方式如:常用的Jwt认证、自定义认证等,那么如何实现呢?
1、在Startup的ConfigureServices 方法中添加以下逻辑:
public void ConfigureServices(IServiceCollection services){ //other code services.Configure(Configuration.GetSection("JWTSetting")); var token = Configuration.GetSection("JWTSetting").Get(); //JWT认证 services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; //添加自定义认证处理器 x.AddScheme(CustomerAuthenticationHandler.CustomerSchemeName, CustomerAuthenticationHandler.CustomerSchemeName); }).AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(token.SecretKey)), ValidIssuer = token.Issuer, ValidAudience = token.Audience, ValidateIssuer = false, ValidateAudience = false }; }); //other code} 2、在需要支持多种认证方式的控制器上添加标记:
//指定认证时,采用CustomerAuthenticationHandler.CustomerSchemeName[Authorize(AuthenticationSchemes = CustomerAuthenticationHandler.CustomerSchemeName)][Route("api/[controller]")][ApiController]public class AuditLogController : ControllerBase{ //code}//指定认证采用JWT [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public class WeatherForecastController : ControllerBase { //code }这样就支持了两种认证方式
3、一个控制器支持多种认证类型:继承Jwt认证处理,并根据Scheme那么调用自定义的认证处理器:
////// 方式二:同时支持多种认证方式/// public class MultAuthenticationHandler : JwtBearerHandler{ public const string MultAuthName = "MultAuth"; IUserService _userService; public MultAuthenticationHandler(IOptionsMonitoroptions, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IUserService userService) : base(options, logger, encoder, clock) { _userService = userService; } protected override Task HandleAuthenticateAsync() { Context.Request.Headers.TryGetValue("Authorization", out StringValues values); string valStr = values.ToString(); if (valStr.StartsWith(CustomerAuthenticationHandler.CustomerSchemeName)) { var result = Valid(); if (result != null) return Task.FromResult(AuthenticateResult.Success(result)); else return Task.FromResult(AuthenticateResult.Fail("未认证")); } else return base.AuthenticateAsync(); } private AuthenticationTicket Valid() { Context.Request.Headers.TryGetValue("Authorization", out StringValues values); string valStr = values.ToString(); if (!string.IsNullOrWhiteSpace(valStr)) { //认证模拟basic认证:cusAuth YWRtaW46YWRtaW4= string[] authVal = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(valStr.Substring(CustomerAuthenticationHandler.CustomerSchemeName.Length + 1))).Split(':'); var loginInfo = new Dto.LoginDto() { Username = authVal[0], Password = authVal[1] }; if (_userService.IsValid(loginInfo)) return GetAuthTicket(loginInfo.Username, "admin"); } return null; } /// /// 生成认证票据 /// /// /// ///private AuthenticationTicket GetAuthTicket(string name, string role) { var claimsIdentity = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, name), new Claim(ClaimTypes.Role, role), }, CustomerAuthenticationHandler.CustomerSchemeName); var principal = new ClaimsPrincipal(claimsIdentity); return new AuthenticationTicket(principal, CustomerAuthenticationHandler.CustomerSchemeName); }}
.Net Core中的自定义认证主要通过实现IAuthenticationHandler 接口实现,如果要实现多认证方式通过AddScheme 应用自定义实现的认证处理器。
看完上述内容,你们对.Net Core中如何写自定义认证实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
认证
处理
方式
支持
内容
处理器
多种
控制器
逻辑
控制
项目
同时
标记
票据
类型
生成
登陆
接下来
代码
名称
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
百单网互联网科技有限公司怎么样
深圳九邦互联网科技有限公司
互联网科技工作委员会副主任毛军
互联网巨头反垄断金融科技
互联网科技的发展
互联网金融 金融科技
互联网 卓越科技
互联网科技公司官网
上海万想互联网科技
互联网科技股午盘股票涨跌
恒银科技与互联网金融
中国互联网有什么科技含量
彤创互联网科技有限公司
湖南一路畅行互联网科技
畅思互联网科技
保险科技服务互联网营销体系
山东子淼互联网科技有限公司
互联网金融科技公司的优势
神州科技互联网有限公司
上海旺乐尼互联网科技有限公司
互联网科技公司税收优惠
互联网巨头科技公司
互联网科技开发公司
远拓互联网科技
互联网金融和金融科技
上海宁丞科技互联网
互联网科技公司实习生
成都互联网科技公司工作好不好
互联网科技包装股
科技发展第三阶段互联网时代