首页 > 其他分享 >NET6 自定义授权中间件

NET6 自定义授权中间件

时间:2024-05-10 17:46:30浏览次数:27  
标签:自定义 启用 app 中间件 身份验证 context 授权 NET6

AuthorizationWithCustMiddleware

/// <summary>
/// 自定义授权中间件类:使用 身份验证中间件 存储的身份信息来进行权限验证
/// 一定要先启用 身份验证中间件(app.UseAuthentication()),它会验证请求中的身份信息,并将身份信息存储在HttpContext.User属性中
/// 如果没有启用身份验证中间件,授权中间件将无法获取到身份信息,从而无法进行权限验证。
/// </summary>
public class AuthorizationWithCustMiddleware
{
    private readonly RequestDelegate _next;

    /// <summary>
    /// 1.拥有public构造函数,且该构造函数中至少包含一个类型为RequestDeleGet的参数
    /// </summary>
    /// <param name="next"></param>
    public AuthorizationWithCustMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    /// <summary>
    /// 拥有名为Invoke或InvokeAsync的public方法,该方法必须包含类型为HttpContext的参数,且该参数必须位于第一个位置,
    /// 另外返回值必须为Task类型
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task Invoke(HttpContext context)
    {
        // 在这里编写自定义的授权逻辑
        if (!IsUserAuthorized(context))
        {
            context.Response.ContentType = "application/json; charset=utf-8";
            await context.Response.WriteAsync("{\"Code\": 401, \"Message\": \"Unauthorized\"}");
            return;
        }

        await _next(context);
    }

    private bool IsUserAuthorized(HttpContext context)
    {
        //  在这里编写具体的授权逻辑,例如检查用户的角色、权限等
        //  返回true表示用户有权限,返回false表示用户无权限
        var metada = context?.GetEndpoint()?.Metadata;
        if (metada == null) return true;

        //  是否允许匿名访问
        var isAllowAnonymous = metada.OfType<AllowAnonymousAttribute>().Any();
        //  允许匿名访问则跳过
        if (isAllowAnonymous) return true;
        //  是否需要权限授权
        var isAuthoriza = metada.OfType<AuthorizeAttribute>().Any();
        //  不需要则跳过
        if (!isAuthoriza) return true;

        //  具体业务逻辑:暂时只根据jwt检查用户信息
        var claims = context?.User?.Claims;
var isAny = claims?.Any(); if (isAny == true) return true; return false; } }

MiddlewareExtendsions

/// <summary>
/// 简单封装中间件调用
/// </summary>
public static class MiddlewareExtendsions
{
    /// <summary>
    /// 启用自定义授权中间件
    /// </summary>
    /// <param name="app"></param>
    /// <returns></returns>
    public static IApplicationBuilder UseAuthorizationWithCust(this IApplicationBuilder app)
    {
        return app.UseMiddleware<AuthorizationWithCustMiddleware>();
    }
}

Program

//  启用身份验证中间件:注意,一定得先启动这个
app.UseAuthentication();
//  启用自定义授权中间件
app.UseAuthorizationWithCust();
//  启用授权中间件
//  app.UseAuthentication()是启用身份验证中间件,它会验证请求中的身份信息,并将身份信息存储在HttpContext.User属性中。
//  而app.UseAuthorization()是启用授权中间件,它会检查HttpContext.User中的身份信息是否有访问当前请求所需的权限。
//  一定要先启用身份验证中间件再启用授权中间件,因为授权中间件需要使用身份验证中间件存储的身份信息来进行权限验证。
//  如果没有启用身份验证中间件,授权中间件将无法获取到身份信息,从而无法进行权限验证。
app.UseAuthorization();

 

标签:自定义,启用,app,中间件,身份验证,context,授权,NET6
From: https://www.cnblogs.com/CRobot/p/18184958

相关文章

  • 自定义鼠标设置-中键设置为后退
    这个软件能够修改鼠标的很多设置公司配置的鼠标没有侧边按键导致没有后退按键可以使用,使阅读代码不够流畅使用这款软件就能将中间设置为后退,使阅读代码更加流畅下载网站为https://www.highrez.co.uk/downloads/XMouseButtonControl.htm汉化语言包链接为https://www.highr......
  • Laravel 实现自定义资源路由
    Laravel如何实现自定义资源路由最近在开发过程中,发现总有一些路由需要重复定义,比如切换状态,导出,回收站啊之类的。如果使用Laravel自带的资源路由方法,还不足以满足重复劳动得过程。所以是否有方法可以自定义项目得资源路由呢?在Laravel中,资源路由一般有两种服务端渲染Route:......
  • 自定义表单工作流的优势介绍
    当前,应用低代码技术平台可以助力企业提高效率,降低开发成本,实现个性化场景定制,因而越来越得到了客户的信赖与喜爱。很多客户朋友询问自定义表单工作流的优势和特点,为了帮助大家解决这个疑问,今天,就跟大家一起分享低代码技术平台以及自定义表单工作流的相关知识,相信从这些字里行间中......
  • Ant Design Blazor Table 组件的 自定义分页样式, 显示全部记录数,ShowTotal
    在AntDesignBlazor中,Table 组件的 ShowTotal 属性是一个泛型属性,它可以是两种类型之一:Func<PaginationTotalContext,string> 或 RenderFragment<PaginationTotalContext>。这个属性用于定义如何显示表格数据的总条数。OneOf<T1,T2> 是一个特殊的类型,它表示这个......
  • JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)
    一、简介Map就是用来存储“键(key)-值(value)”对的.通过键寻找value,所以键不能重复.数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便.实际开发中较为常用.二、Map的常用方法实例(1......
  • [4]自定义Lua解析器管理器-------演化脚本V0.7
    使用自定义lua解析管理器调用函数使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。先看代码,依旧是上篇文章中所贴的脚本。新增调用两个函数testFuncusingSystem;usingBaseFramework;usingLuaInterface;usingUnityEngine;usingUnityEngine.Events;us......
  • 深入理解Django:中间件与信号处理的艺术
    title:深入理解Django:中间件与信号处理的艺术date:2024/5/918:41:21updated:2024/5/918:41:21categories:后端开发tags:Django中间件信号异步性能缓存多语言引言在当今的Web开发领域,Django以其强大的功能、简洁的代码结构和高度的可扩展性,已成为众多开......
  • 自定义上传图片到服务器出现了上传失败的问题
    1、上传路径没改动这里在上传的时候发现存入路径是windows版本的//读取原始文件名StringfileName=file.getOriginalFilename();//获取后缀名StringsuffixName=fileName.substring(fileName.lastIndexOf("."));......
  • 自定义协议通信协议实现简易群聊
    基础需求简易版聊天室,仅为演示自定义协议,所以只添加了登录登出功能。代码部分相当粗糙,很多场景没有进行细致考虑,仅展现了一个思路。首先进行一下基本流程分析服务端启动以后,监听某个地址和端口,接收新的客户端连接。连接建立以后,客户端发送登录请求,服务端进行校验并返回请......
  • 微信小程序使用微信云托管添加自定义域名并转发到pexels.com
    背景:我要在小程序上显示pexels.com上的图片,然后我得先把pexels.com的域名添加到小程序的request合法域名中,但是pexels.com是国外的,在国内没有备案所以添加不了。解决方案就是:用一个已经备案好的域名进行转发,转发的服务器我选择的是微信云托管,备案好的域名还需要ssl,没有的话本文会......