zoukankan      html  css  js  c++  java
  • NetCore获取当前请求URL的方法

    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    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
        {
            /// <summary>
            /// 获取绝对路径 https://localhost:44351/V1/Teacher/GetTeacherList
            /// </summary>
            /// <param name="request"></param>
            /// <returns></returns>
            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();
            }
            /// <summary>
            /// 获取接口相对路径 /V1/Teacher/GetTeacherList
            /// </summary>
            /// <param name="request"></param>
            /// <returns></returns>
            public static string GetrelativeUri(this HttpRequest request)
            {
                return request.Path;
            }
        }
    }

    还有一种获取完整/绝对路径方法如下:

      string displayUrl = HttpContext.Request.GetDisplayUrl();

    那么获取这些地址有什么用呢?

    如果我们开发一个NetCore.WebApi的项目,那么要想做到安全,除了Token验证以外,还需要一套后端权限管理系统,即使有了后端权限管理系统,也不能做到【绝对】安全,这时候,我们就有必要对请求的接口做验证,验证当前请求用户有没有权限访问该接口。

    那么怎么做呢?

    第一步:用户登录,返回用户的Token及功能权限【菜单及按钮权限】。

    第二步:在用户访问有权限限制的接口前,通过在 父亲基类 OnActionExecuting 方法中构造验证方法,如下:

            /// <summary>
            /// 第4步 执行OnActionExecuting方法
            /// </summary>
            /// <param name="context"></param>
            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<TokenFranchiseeModel>(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的执行顺序,可参考我的博客:Net Core 页面的生命周期 + OnActionExecuting

    @天才卧龙的博客

  • 相关阅读:
    下载ORACLE中BLOB内容到客户端
    VIEW_PK
    带下拉框的GridView的OnRowEditing
    HyperLinkField
    ArcEngine开发 退出系统报错
    【转载】Winform 中的控件透明设置要点
    【转载】大整数相乘
    c# oracle 分页
    view_fk
    ITopologicalOperator Intersect
  • 原文地址:https://www.cnblogs.com/chenwolong/p/13405638.html
Copyright © 2011-2022 走看看