.net core下访问控制层的实现详解
对于一般的程序而言,如果在未登录的情况下理应是没有对应的权限访问对应的页面的,同时,不同的用户也需要验证该用户权限是否满足条件。
对于后端服务来说,就需要有个中间层进行拦截,验证对应的http请求是否满足权限要求。
这里我们用到了Middleware-请求管道,通过自定义中间件的方式来实现对Http请求的拦截,实现相关验证。
实现逻辑
用户在登录成功后,我们在服务端会自动生成一个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的运行原理,以便更好的去实现你想要的方法。
作者:虾米哥
微信公众号:IT虾米,左侧为二维码
个人技术网站-IT虾米网:http://www.itxm.cn
个人技术网站-编程符号网:http://www.itfh.cn
个人技术网站-IT干货网:http://www.itgh.cn
新浪微博:https://weibo.com/u/2814576687
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)