.net core下访问控制层的实现

在上一篇[.net core下对于附件上传下载的实现]主要介绍了 .net core下文件上传下载的相关操作,本篇主要介绍下对于权限验证如何通过自定义的中间件进行拦截实现。

对于一般的程序而言,如果在未登录的情况下理应是没有对应的权限访问对应的页面的,同时,不同的用户也需要验证该用户权限是否满足条件。

对于后端服务来说,就需要有个中间层进行拦截,验证对应的http请求是否满足权限要求。

这里我们用到了Middleware-请求管道,通过自定义中间件的方式来实现对Http请求的拦截,实现相关验证。

对于Middleware-请求管道的原理和解释可以参考这篇文章:Middleware-请求管道的构成

实现逻辑

用户在登录成功后,我们在服务端会自动生成一个Token,这个Token会绑定对应的权限,同时保存到Redis中。

我们自定义的中间层会拦截请求,获取请求中的Token是否合法,若不合法会对该请求进行拦截。

通过使用UseMiddleware扩展方法,将拦截到的HttpContext进行相应的逻辑处理。

具体代码

首先我们自定义一个权限控制的中间件,SecurityMiddleware类就是我们具体的逻辑实现。

public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
    return builder.UseMiddleware<SecurityMiddleware>();
}

Startup.cs中的Configure方法下,我们添加我们自定义的中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSwagger();
    app.UseSwaggerUI(c => {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "我的API V1");
    });

    app.UseSecurity();//自定义中间件

    app.UseMvc();
}

接下来我们具体实现对应的SecurityMiddleware类,主要实现对应的Invoke方法

public async Task Invoke(HttpContext context)
{
    string path = context.Request.Path.ToString().ToLower();

    // 判断请求的路径是否是排除权限限制的(如登录页,登录页)
    if (excludeUrl.Contains(path))
    {
        await _next(context);
        return;
    }

    // 寻找header中的token
    string userToken = string.Empty;            
    bool hasValue = context.Request.Headers.TryGetValue(INVOKER_TOKEN_HEADER, out StringValues token);
    if (!hasValue || token.Count == 0)
    {
        // 若header没取到token,则尝试从cookie中获取
        userToken = context.Request.Cookies[USER_TOKEN_COOKIE_NAME];
        if(string.IsNullOrWhiteSpace(userToken))
        {
            // TODO: 尚未登录,未经授权
            await CreateUnauthorizedResponse(context);

            return;
        }
    }
    else
    {
        userToken = token[0];
    }

    //根据对应的Token到Redis中找对应的权限数据,若没找到,说明没有授权
    var userInfo = await GetUserInfo(userToken);
    if (userInfo == null)
    {
        // TODO: 尚未登录,未经授权
        await CreateUnauthorizedResponse(context);
        return;
    }

    //可继续针对请求判断是否有相对应的权限
}

对应构造Response方法:

private static async Task CreateUnauthorizedResponse(HttpContext context)
{
    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    context.Response.ContentType = "application/json;charset=utf-8";

    ResponseResult result = new ResponseResult
    {
        Result = false,
        ErrorMessage = "您需要登录后访问此资源,请先进行登录操作。",
        Code = ResponseCode.Unauthorized
    };

    await context.Response.WriteAsync(JsonConvert.SerializeObject(result), Encoding.UTF8);
}

到这里,我们基本上实现的对应的控制访问。

总结

对于本篇来说,还是需要去了解下 .net core的运行原理,以便更好的去实现你想要的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三架构,各单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问的接口、业务逻辑的接口等接口之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少之间的依赖等。6.封装出DbSession类,让它拥有所有Dal实例和SaveChanges方法。7.设计出数据访问及业务逻辑主要类的T4模板,以便实体增加时自动生成相应的类。8.表现要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值