首页 > 编程语言 >C# .NET6 WebAPI JWT身份验证服务

C# .NET6 WebAPI JWT身份验证服务

时间:2024-04-02 10:36:15浏览次数:36  
标签:WebAPI C# 身份验证 Value context using var new options

自定义扩展类

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Text.Json;

namespace Demo
{
    /// <summary>
    /// 自定义扩展类
    /// </summary>
    public static class CustomExpand
    {
        /// <summary>
        /// 添加模型绑定异常处理
        /// </summary>
        /// <param name="services"></param>
        /// <exception cref="CustomException"></exception>
        public static void AddModelBindingExceptionHandling(this IServiceCollection services)
        {
            services.Configure<ApiBehaviorOptions>(options =>
            {
                options.InvalidModelStateResponseFactory = actionContext =>
                {
                    // 获取验证失败的模型字段
                    //var errors = actionContext.ModelState
                    //    .Where(s => s.Value != null && s.Value.ValidationState == ModelValidationState.Invalid)
                    //    .SelectMany(s => s.Value!.Errors.ToList())
                    //    .Select(e => e.ErrorMessage)
                    //    .ToList();
                    var error = actionContext.ModelState
                        .Where(s => s.Value != null && s.Value.ValidationState == ModelValidationState.Invalid)
                        .SelectMany(s => s.Value!.Errors.ToList())
                        .Select(e => e.ErrorMessage).FirstOrDefault();
                    // 统一返回格式
                    throw new CustomException(ResultLevel.Error, ResultCode.ModelError, error);
                    //var result = new CustomResult<List<string>>(ResultLevel.Error, ResultCode.ModelError, errors);
                    //return new BadRequestObjectResult(result);
                };
            });
        }
        /// <summary>
        /// 添加身份认证事件
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public static JwtBearerOptions AddAuthenticationEvents(this JwtBearerOptions options)
        {
            // JWT
            options.Events = new JwtBearerEvents()
            {
                // 未登录
                OnChallenge = context => AuthenticationFailed(context),
                // 身份认证失败
                OnAuthenticationFailed = context => AuthenticationFailed(context),
                // 没有权限
                OnForbidden = context => AuthenticationFailed(context),
            };
            return options;
        }
        /// <summary>
        /// 身份认证失败
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private static Task AuthenticationFailed(BaseContext<JwtBearerOptions> context)
        {
            var ex = new CustomException(ResultLevel.Error, ResultCode.IdentityAuthFailed, ResultMsg.IdentityAuthFailed);
            var result = new CustomResult<CustomException>(ex);
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            context.Response.ContentType = "application/json";
            context.Response.Body.Flush();
            context.Response.Body.Position = 0;
            return JsonSerializer.SerializeAsync(context.Response.Body, result,
                new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
            );
        }
    }
}
View Code

使用方法

// 添加JWT身份验证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
    // Jwt验证配置
    .AddJwtBearer(options =>
    {
        // 身份认证参数
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = configuration["Jwt:Issuer"],
            ValidAudience = configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:IssuerSigningKey"]))
        };
        // 身份认证事件
        options.AddAuthenticationEvents();
    });

 

翻译

搜索

复制

标签:WebAPI,C#,身份验证,Value,context,using,var,new,options
From: https://www.cnblogs.com/smartnn/p/18110031

相关文章

  • Android TV Recyclerview长按或连续按键,焦点丢失(或者焦点跳跃)
    原因分析RecyclerView设置适配器后,将数据填充进去,并不会将所有item的view都创建出来,一般只会创建一个屏幕的Item,当长按或者快速按下键时,Recyclerview来不及创建即将获取焦点的view,导致焦点丢失解决方法有两种思路:(1)控制按键速度 这里有两种具体实现策略:一种是记录......
  • Ubuntu安装docker
    官网卸载系统docker,防止冲突forpkgindocker.iodocker-docdocker-composedocker-compose-v2podman-dockercontainerdrunc;dosudoapt-getremove$pkg;done卸载请参照docker卸载设置docker的apt仓库sudoapt-getupdatesudoapt-getinstallca-certificat......
  • static 关键字2----不是原创
    在学习volatile关键字时,在此重温下C语言的其他关键字static。这个关键字可以说到处都在用,但是能否详细说清楚这个static应该怎么用,什么场景用,怎么用合适?当你写下static的时候,是否考虑了真的需要用static吗?在前面笔记中也有学习了static,但明显感觉得出来,当时对static的理解不到......
  • CleanMyMac X2024专为苹果Mac系统设计的垃圾清理工具
    CleanMyMac作为一款专为Mac系统设计的垃圾清理工具,以其强大的清理能力、简便的操作方式以及卓越的系统兼容性,受到了众多Mac用户的青睐。以下是对这款软件功能的详细介绍:CleanMyMacX2024全新版下载如下:https://wm.makeding.com/iclk/?zoneid=49983一、高效彻底的清理效果......
  • 2024简洁易用的mac电脑管家CleanMyMac
    CleanMyMac:Mac系统的全能“清洁员”当我们谈论Mac系统的优化与维护时,CleanMyMac无疑是一个不可或缺的工具。这款软件凭借其出色的清理效果、简洁的操作界面以及良好的系统兼容性,赢得了众多Mac用户的青睐。接下来,我将为您详细介绍CleanMyMac的功能特点,带您领略其强大与便捷。......
  • 2024免费Mac上读写Windows格式的硬盘或U盘软件Tuxera Ntfs
    TuxeraforMac产品介绍在现代工作和生活中,数据交换已成为日常不可或缺的一部分。特别是在Mac系统中,用户经常需要读写各种格式的硬盘或U盘。TuxeraforMac作为一款专为Mac用户打造的读写工具,旨在解决跨文件系统兼容性问题,让用户无忧地在Mac上读写Windows格式的硬盘或U盘。Tu......
  • EasyRecovery15mac苹果免费版电脑数据恢复软件下载
    EasyRecovery确实是一款支持各式存储介质操作安全、价格适中且用户可自主操作的数据恢复软件。首先,在支持存储介质方面,EasyRecovery表现出色。它支持从多种存储设备中恢复数据,包括但不限于硬盘、U盘、SD卡等。无论是因误删除、格式化、病毒攻击还是硬件故障导致的数据丢失,Easy......
  • 【python】字典(Dictionary)与集合(Set)
    字典是一种键值对的数据结构,而集合是一种无序、元素不重复的数据结构。目录前言正文一、字典(dict)    1、字典的定义    注意:        2、字典的查询    2.1语法:字典名['键名']    2.2语法:字典名.get('键名')   ......
  • BetterZip2024功能强大、操作便捷且用户体验优秀的Mac端解压缩软件
    作为一名软件专家,对于市面上各类软件都有较为深入的了解,下面介绍的是一款适用于Mac系统的解压缩软件——BetterZip,将从其功能特点、使用方法、用户体验及适用人群等方面进行详细介绍。BetterZip5-安装包绿色版下载如下:https://wm.makeding.com/iclk/?zoneid=60187首先是功......
  • ElasticSearch 实战:ElasticSearch文档多条件查询
    Elasticsearch实战:Elasticsearch文档多条件查询在实际应用中,常常需要根据多个条件对文档进行筛选。Elasticsearch提供了多种查询类型和查询组合机制,支持构建复杂的多条件查询。以下是如何进行文档多条件查询的详细步骤:**1.**布尔查询(BoolQuery)布尔查询是构建多条件......