返回顶部
首页 > 资讯 > 精选 >.Net Core中如何写自定义认证实现
  • 664
分享到

.Net Core中如何写自定义认证实现

2023-06-28 23:06:32 664人浏览 安东尼
摘要

今天就跟大家聊聊有关.net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、起因 最近项目中需要对项目同时支持Jwt认证,以及自定义的认证

今天就跟大家聊聊有关.net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一、起因

 最近项目中需要对项目同时支持Jwt认证,以及自定义的认证校验方式认证。通过对官方文档了解,得到认证实现主要通过继承 IAuthenticationHandler 或 AuthenticationHandler<TOptions>来实现自定义认证的处理。 

 那么接下来实现一个自定义的认证访问。

二、自定义认证实现 

 1、根据前面内容得知,处理认证通过IAuthenticationHandler 实例处理;那么首先添加一个自定义IAuthenticationHandler 类型:

/// <summary>/// 方式一:自定义认证处理器/// </summary>public class CustomerAuthenticationHandler : IAuthenticationHandler{    private IUserService _userService;    public CustomerAuthenticationHandler(IUserService userService)    {        _userService = userService;    }    /// <summary>    /// 自定义认证Scheme名称    /// </summary>    public const string CustomerSchemeName = "cusAuth";    private AuthenticationScheme _scheme;    private HttpContext _context;    /// <summary>    /// 认证逻辑:认证校验主要逻辑    /// </summary>    /// <returns></returns>    public Task<AuthenticateResult> 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);    }    /// <summary>    /// 未登录时的处理    /// </summary>    /// <param name="properties"></param>    /// <returns></returns>    public Task ChallengeAsync(AuthenticationProperties properties)    {        _context.Response.StatusCode = (int)httpstatusCode.Unauthorized;        return Task.CompletedTask;    }    /// <summary>    /// 权限不足时处理    /// </summary>    /// <param name="properties"></param>    /// <returns></returns>    public Task ForbidAsync(AuthenticationProperties properties)    {        _context.Response.StatusCode = (int)HttpStatusCode.Forbidden;        return Task.CompletedTask;    }    /// <summary>    /// 初始化认证    /// </summary>    /// <param name="scheme"></param>    /// <param name="context"></param>    /// <returns></returns>    public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)    {        _scheme = scheme;        _context = context;        return Task.CompletedTask;    }    #region 认证校验逻辑    /// <summary>    /// 生成认证票据    /// </summary>    /// <param name="name"></param>    /// <param name="role"></param>    /// <returns></returns>    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}/// <summary>/// 方式二:继承已实现的基类/// </summary>public class SubAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>{    public SubAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)        : base(options, logger, encoder, clock)    {    }    protected override Task<AuthenticateResult> 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>(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}

  调用

.Net Core中如何写自定义认证实现

三、多认证支持

 在实际项目中可能存在,对一个控制器支持多种认证方式如:常用的Jwt认证、自定义认证等,那么如何实现呢?

 1、在Startup的ConfigureServices 方法中添加以下逻辑:

public void ConfigureServices(IServiceCollection services){    //other code    services.Configure<JwtSetting>(Configuration.GetSection("JWTSetting"));    var token = Configuration.GetSection("JWTSetting").Get<JwtSetting>();    //JWT认证    services.AddAuthentication(x =>    {        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;     //添加自定义认证处理器        x.AddScheme<CustomerAuthenticationHandler>(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那么调用自定义的认证处理器:

/// <summary>/// 方式二:同时支持多种认证方式/// </summary>public class MultAuthenticationHandler : JwtBearerHandler{    public const string MultAuthName = "MultAuth";    IUserService _userService;    public MultAuthenticationHandler(IOptionsMonitor<JwtBearerOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IUserService userService)        : base(options, logger, encoder, clock)    {        _userService = userService;    }    protected override Task<AuthenticateResult> 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;    }    /// <summary>    /// 生成认证票据    /// </summary>    /// <param name="name"></param>    /// <param name="role"></param>    /// <returns></returns>    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中如何写自定义认证实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: .Net Core中如何写自定义认证实现

本文链接: https://lsjlt.com/news/321264.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .Net Core中如何写自定义认证实现
    今天就跟大家聊聊有关.Net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、起因 最近项目中需要对项目同时支持JWT认证,以及自定义的认证...
    99+
    2023-06-28
  • .NetCore中自定义认证实现
    目录一、起因二、自定义认证实现 三、多认证支持四、总结一、起因  最近项目中需要对项目同时支持JWT认证,以及自定义的认证校验方式认证。通过对官方文档了解,得到认证实现主要...
    99+
    2024-04-02
  • Asp.Net Core如何添加请求头自定义认证
    小编给大家分享一下Asp.Net Core如何添加请求头自定义认证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!要点实现 IAuthenticationHandler 接口:4 个方法首先会调用 InitializeAsy...
    99+
    2023-06-14
  • Asp.net Core中实现自定义身份认证的示例代码
    Asp.Net Core中虽然集成了许多常用的身份认证,但很多时候,我们还是需要实现自己的身份认证接口,本文这里就简单的介绍下如何实现自定义身份认证接口。 首先写一个简单的接口...
    99+
    2022-06-07
    自定义 ASP.NET net 示例 core ASP
  • .Net Core如何授权认证JWT
    这篇文章主要讲解了“.Net Core如何授权认证JWT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.Net Core如何授权认证JWT”吧!一、前言现在越来越多的项目...
    99+
    2023-07-02
  • .net core api接口如何实现JWT方式认证Token
    这篇文章主要介绍.net core api接口如何实现JWT方式认证Token,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目>管理Nuget包 安装二、.appsettings.js...
    99+
    2023-06-22
  • spring security 自定义Provider 如何实现多种认证
    目录security内部认证流程是这样的1、 Controller2、spring security3、调用匹配的provider内部认证逻辑4、UserDetailsService...
    99+
    2024-04-02
  • SpringSecurity自定义认证器的实现代码
    目录AuthenticationAuthenticationProviderSecurityConfigurerAdapterUserDetailsServiceTokenFilte...
    99+
    2024-04-02
  • Asp.Net Core添加请求头自定义认证的示例
    目录前言要点GuidToken 类就是我们自定义的 token 管理器最后就是使用方式前言 小项目中需要添加 Api 请求权限认证, 并且只是专用网络内使用,于是只想简单得认证下是...
    99+
    2024-04-02
  • .NET自定义控件应该如何实现
    本篇内容介绍了“.NET自定义控件应该如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.NET自定义控件有很多人其实不太适应去试用,一...
    99+
    2023-06-17
  • .NET Core怎么实现Cookie和JWT混合认证、授权
    本篇内容介绍了“.NET Core怎么实现Cookie和JWT混合认证、授权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言为防...
    99+
    2023-06-26
  • DreamWeaver CS3中如何实现SPRY的自定义验证
    这篇文章将为大家详细讲解有关DreamWeaver CS3中如何实现SPRY的自定义验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:<span id="sprytextfiel...
    99+
    2023-06-08
  • .Net Core如何实现限流
    小编给大家分享一下.Net Core如何实现限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、环境vs2019.Net Core 3.1引用 AspNetCo...
    99+
    2023-06-20
  • .Net Core如何配置与实现自动更新
    这篇文章给大家分享的是有关.Net Core如何配置与实现自动更新的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.Net Core 将之前Web.Config中的配置迁移到了appsettings.json文件中...
    99+
    2023-06-19
  • Spring Security自定义认证逻辑实例详解
    目录前言分析问题自定义 Authentication自定义 Filter自定义 Provider自定义认证成功/失败后的 Handler配置自定义认证的逻辑测试总结前言 这篇文章的内...
    99+
    2024-04-02
  • ASP.NET Core MVC如何自定义Tag Helpers
    这篇文章主要为大家展示了“ASP.NET Core MVC如何自定义Tag Helpers”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ASP.NET C...
    99+
    2023-06-29
  • .Net core Blazor怎么自定义日志提供器实现实时日志查看器
    本文小编为大家详细介绍“.Net core Blazor怎么自定义日志提供器实现实时日志查看器”,内容详细,步骤清晰,细节处理妥当,希望这篇“.Net core Blazor怎么自定义日志提供器实现实...
    99+
    2023-07-04
  • Django通过自定义认证后端实现多种登录方式验证
    目录前言实现自定义认证后端前言 我们见到几乎所有的 Web 网站或者手机 App 也好,它们的最终目的都是要留住用户,提升自己网站的用户注册量,所以说用户的概念也必须深入到每一个程序...
    99+
    2024-04-02
  • ASP.NET Core AutoWrapper 自定义响应输出实现
    前言 AutoWrapper是一个简单可自定义全局异常处理程序和ASP.NET Core API响应的包装。他使用ASP.NET Core middleware拦截传入的HT...
    99+
    2022-06-07
    自定义 net ASP.NET 输出 core ASP
  • Python中如何自定义密码验证
    这篇文章主要介绍“Python中如何自定义密码验证”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中如何自定义密码验证”文章能帮助大家解决问题。下面是重构后的代码:from st...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作