
NetCore获取当前请求URL的方法
发布日期:2021-05-09 01:18:04
浏览次数:22
分类:精选文章
本文共 3871 字,大约阅读时间需要 12 分钟。
十年河东,十年河西,莫欺少年穷
学无止境,精益求精
NetCore获取请求的完整/绝对路径及相对路径方法如下:
using Microsoft.AspNetCore.Http;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace FranchiseeApi.Helper{ public static class UrlHelper { ////// 获取绝对路径 https://localhost:44351/V1/Teacher/GetTeacherList /// /// ///public static string GetAbsoluteUri(this HttpRequest request) { return new StringBuilder() .Append(request.Scheme) .Append("://") .Append(request.Host) .Append(request.PathBase) .Append(request.Path) .Append(request.QueryString) .ToString(); } /// /// 获取接口相对路径 /V1/Teacher/GetTeacherList /// /// ///public static string GetrelativeUri(this HttpRequest request) { return request.Path; } }}
还有一种获取完整/绝对路径方法如下:
string displayUrl = HttpContext.Request.GetDisplayUrl();
那么获取这些地址有什么用呢?
如果我们开发一个NetCore.WebApi的项目,那么要想做到安全,除了Token验证以外,还需要一套后端权限管理系统,即使有了后端权限管理系统,也不能做到【绝对】安全,这时候,我们就有必要对请求的接口做验证,验证当前请求用户有没有权限访问该接口。
那么怎么做呢?
第一步:用户登录,返回用户的Token及功能权限【菜单及按钮权限】。
第二步:在用户访问有权限限制的接口前,通过在 父亲基类 OnActionExecuting 方法中构造验证方法,如下:
////// 第4步 执行OnActionExecuting方法 /// /// public override void OnActionExecuting(ActionExecutingContext context) { //验证Token是否正确 string displayUrl = HttpContext.Request.GetDisplayUrl(); if (displayUrl.Contains("Api/V1/Franchisee/Login")) { base.OnActionExecuting(context); } else { //解析Token 赋值给UserData if (!Request.Headers.TryGetValue("Authorization", out var apiKeyHeaderValues)) { CurrentUser = null; } else { //swagger 需要加Bearer 开头 真实的Token中也不存在空格 因此 Replace 是为了兼容swagger var token = apiKeyHeaderValues.FirstOrDefault().Replace("Bearer ", ""); var jwtToken= new JwtSecurityTokenHandler().ReadJwtToken(token); var roleLst = jwtToken.Claims.Where(A => A.Type.Contains("role")).ToList(); if (roleLst != null) { foreach(var item in roleLst) { if (!string.IsNullOrEmpty(item.Value)) { CurrentUser.RoldeCodeList.Add(item.Value); } } } var NameModel = jwtToken.Claims.Where(A => A.Type.Contains("name")).ToList().FirstOrDefault(); CurrentUser.Account = NameModel == null ? "" : NameModel.Value; var userdataModel = jwtToken.Claims.Where(A => A.Type.Contains("userdata")).ToList().FirstOrDefault(); string UserDataJson = userdataModel == null ? "" : userdataModel.Value; var UserData = JsonConvert.DeserializeObject(UserDataJson); CurrentUser.userData = UserData; var expModel = jwtToken.Claims.Where(A => A.Type.Contains("exp")).ToList().FirstOrDefault(); CurrentUser.exp = expModel == null ? "" : expModel.Value; } //获取请求的相对路径、 var relativeUri = UrlHelper.GetrelativeUri(HttpContext.Request); // //非登录接口均需要进行接口访问权限的验证,我们将接口访问权限存储到数据库中,这样即使我们的Token别盗取,他也只能访问盗取Token对应的接口权限。 //验证接口权限 // //验证接口权限待完善 // //验证不通过,抛出异常,由异常中间件捕获并返回异常消息。 // } }
关于NetCore Action的执行顺序,可参考我的博客:
@天才卧龙的博客
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月14日 15时48分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LayUI之CRUD
2023-01-30
layui图标使用和自定义矢量库图标
2023-01-30
layui简单入门
2023-01-30
Leaflet中使用leaflet.browser.print插件实现打印/导出为pdf
2023-01-30
Leaflet中使用Leaflet.contextmenu插件实现地图上添加鼠标右键菜单
2023-01-30
Leaflet中使用Leaflet.MagnifyingGlass实现放大镜效果
2023-01-30
leaflet军事标绘-直线箭头修改(leaflet篇.87)
2023-01-30
leaflet军事标绘-细直线箭头绘制(leaflet篇.82)
2023-01-30
leaflet删除所有图层(leaflet篇.25)
2023-01-30
leaflet加载接入天地图(leaflet篇.1)
2023-01-30
leaflet加载接入百度地图(leaflet篇.2)
2023-01-30
leaflet加载接入腾讯矢量、腾讯影像地图(leaflet篇.4)
2023-01-30
leaflet动态热力图分析(leaflet篇.16)
2023-01-30
leaflet动态热力图(大数据版)(leaflet篇.17)
2023-01-30
leaflet区域聚合点(点击后散开并进行合理定位)(leaflet篇.22)
2023-01-30
leaflet叠加geojson图层(leaflet篇.38)
2023-01-30
leaflet叠加geojson图层(挖洞)(leaflet篇.43)
2023-01-30
leaflet叠加多个面(面的数据结构)(leaflet篇.62)
2023-01-30
leaflet图标跳动(leaflet篇.45)
2023-01-30