前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.net core下访问控制层的实现

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

作者头像
Bug生活2048
发布2018-08-31 15:56:47
5440
发布2018-08-31 15:56:47
举报
文章被收录于专栏:Bug生活2048Bug生活2048

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

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

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

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

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

实现逻辑

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

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

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

具体代码

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

代码语言:javascript
复制
public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
    return builder.UseMiddleware<SecurityMiddleware>();
}

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

代码语言:javascript
复制
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方法

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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的运行原理,以便更好的去实现你想要的方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Bug生活2048 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现逻辑
  • 具体代码
  • 总结
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档