stevenjin 2024-09-04 20:11 采纳率: 98%
浏览 3
已结题

asp.net core mvc前台页面想通过JWT中的角色,对不同按钮或div进行权限设置

1.环境.net core mvc 7.0
2.前台页面想通过JWT中的角色,对不同按钮或div进行权限设置,如禁用,请教一个靠谱的方法

  • 写回答

1条回答 默认 最新

  • 吃不了席 2024-09-04 20:12
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    要实现ASP.NET Core MVC中基于JWT(JSON Web Tokens)的身份验证和权限控制,您可以通过创建一个自定义中间件或者在视图中应用过滤器来处理JWT令牌中的角色信息。

    方法一:创建自定义中间件

    步骤1: 创建自定义中间件

    首先,确保您的项目已安装了Microsoft.AspNetCore.Authentication.JwtBearer库,这是用于处理JWT令牌的。如果没有安装,可以使用NuGet包管理器添加:

    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    

    接下来,在项目的Startup.cs文件中,注册自定义中间件以处理JWT令牌。这里是一个简单的示例,它将根据JWT中的用户ID来决定是否启用某个按钮或显示特定内容:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.IdentityModel.Tokens;
    
    public class MyCustomJwtMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly JwtSecurityTokenHandler _handler;
    
        public MyCustomJwtMiddleware(RequestDelegate next)
        {
            _next = next;
            _handler = new JwtSecurityTokenHandler();
        }
    
        public async Task Invoke(HttpContext context)
        {
            var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(' ')[1];
            if (token != null)
            {
                var jwt = await _handler.ReadJwtTokenAsync(token);
                // 根据JWT中的用户ID判断是否启用按钮
                // ...
    
                await _next(context);
            }
            else
            {
                context.Response.StatusCode = 401;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync("{}");
            }
        }
    }
    
    public static void UseMyCustomJwtMiddleware(this IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            await next.Invoke();
    
            if (!context.Request.IsAuthenticated)
            {
                return;
            }
    
            var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(' ')[1];
    
            if (token == null)
            {
                context.Response.StatusCode = 401;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync("{}");
                return;
            }
    
            var jwt = await context.RequestServices.GetService<IJwtService>().DecodeToken(token);
    
            // 校验JWT并获取用户ID
            string userId = jwt.Claims.First(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
    
            // 检查是否有权限访问当前页面
            // ...
            
            await next.Invoke();
        });
    }
    

    步骤2: 在控制器方法上应用过滤器

    然后,在需要检查权限的控制器方法上应用UseMyCustomJwtMiddleware方法:

    [ApiController]
    [Route("[controller]")]
    public class YourController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            if (!IsUserAuthorized())
            {
                return Unauthorized();
            }
    
            // 其他业务逻辑...
    
            return Ok("Hello World!");
        }
    
        private bool IsUserAuthorized()
        {
            var user = HttpContext.User.Identity as ClaimsIdentity;
            if (user == null || !user.HasClaim(c => c.Type == ClaimTypes.NameIdentifier))
            {
                return false;
            }
    
            var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
            // 这里是检查用户是否具有权限的逻辑...
            return true;
        }
    }
    

    方法二:在视图中应用过滤器

    对于更复杂的应用场景,您还可以考虑在视图中直接应用过滤器。这通常是在前端JavaScript中完成的,因为前端不需要处理身份验证问题。例如,在HTML模板中应用过滤器:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>View with JWT Authorization</title>
    </head>
    <body>
        <!-- 视图渲染在此处 -->
    </body>
    </html>
    

    在视图中,您可以动态加载包含权限检查逻辑的JavaScript函数,并在需要时调用它们:

    <script>
        function checkAccess() {
            // 假设我们有一个名为`CheckAccess`的函数,它可以返回布尔值
            const accessAllowed = CheckAccess(); 
    
            if (accessAllowed) {
                // 如果允许访问,则执行其他操作
                console.log("Access granted");
            } else {
                // 如果不允许访问,则显示错误消息或跳转到登录页面
                alert("Access denied");
            }
        }
    
        window.onload = () => {
            checkAccess();
        };
    </script>
    

    总结

    这两种方法都可以让您在ASP.NET Core MVC中利用JWT身份验证和权限控制。选择哪种方法取决于您的具体需求和技术栈偏好。希望这个解答对你有所帮助!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月13日
  • 已采纳回答 9月5日
  • 创建了问题 9月4日

悬赏问题

  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗