【.net core】【wetercloud】处理前端项目免登陆,且从前端项目跳转至系统内时的问题

1.前端项目访问后台内容时免登陆(一般用于后台接口需要校验登陆时)

处理思路:将后台用户的登陆校验令牌信息在用户登录后添加至前端项目访问地址的参数列表中,如:

复制代码
https://yourdomain/Home/Index#/https://yourdomain/virtualdirectory/?watercloud_Token=86df42b8-1baa-4e6f-8222-7fa8859e34dd&watercloud_Mark=cf06dad9-3a1c-4c6d-8ccb-4f65aecd20c6&pc_WC-Token=08dddb95-dc77-4fc0-8d83-5bc78a7c8086

修改后台菜单页面链接:此处以设置首页地址为例,如果需要设置为菜单地址则需要增加逻辑判断

在WaterCloud.Web\Controllers\ClientsDataController.cs文件中,修改GetMenuListNew方法

cs 复制代码
/// <summary>
/// 菜单按钮信息
/// </summary>
/// <returns></returns>
private async Task<string> GetMenuListNew()
{

	var currentuser = _userService.currentuser;
    string pc_token =  await CacheHelper.GetAsync<string>("pc_" + GlobalContext.SystemConfig.TokenName + "_" + currentuser.UserId + "_" + currentuser.LoginTime);
    var roleId = currentuser.RoleId;
	StringBuilder sbJson = new StringBuilder();
	InitEntity init = new InitEntity();
	init.homeInfo = new HomeInfoEntity();//首页信息实体
	var url = HttpUtility.UrlEncode( $"watercloud_Token={currentuser.LoginToken}&watercloud_Mark={currentuser.loginMark}&pc_WC-Token={pc_token}");
	//设置首页地址
    init.homeInfo.href = $"{GlobalContext.SystemConfig.HomePage}?{url}";//	https://qzgt.etianshui.com/qzgtxzgl	
    init.logoInfo = new LogoInfoEntity();
	var systemset = await _setService.GetForm(currentuser.CompanyId);
	//修改主页及logo参数
	init.logoInfo.title = systemset.F_LogoCode;
	init.logoInfo.image = ".." + systemset.F_Logo;
	init.menuInfo = new List<MenuInfoEntity>();
	init.menuInfo = ToMenuJsonNew(await _roleAuthorizeService.GetMenuList(roleId), "0");
	sbJson.Append(init.ToJson());
	return sbJson.ToString();
}

此时在打开该前端项目地址时,将可在前端项目页面中,通过页面参数获取后台登陆用户的令牌信息:、watercloud_Token、pc_WC-Token

在调用接口时,可以通过传输令牌信息,后台可通过令牌信息(应该是watercloud_Token,如果不是就换成watercloud_Token)获取缓存中的当前登录用户信息,如:

cs 复制代码
var authHeader = Request.Headers["WC-Token"].ToString();//从请求中的headers中获取令牌信息
var model = await CacheHelper.GetAsync<OperatorModel>("watercloud_operator_"+authHeader+"");//在缓存中获取当前登录用户信息

获取当前用户之后则可进行之后的业务流程

2.前端项目跳转至系统内

在获取登录令牌信息后,可将令牌信息内容设置在cookie中并发起连接的跳转或通过弹框(iframe)打开地址或新页面打开链接(注意:此处通过前端项目打开后台系统菜单地址时,需要前端页面和后台系统在同一个浏览器中打开,且后台必须先登录,后进行跳转,否则将无法识别跳转页面的脚本内容导致页面报错)

前端处理内容:在获取令牌信息后,需将信息格式化为cookie字符串并设置cookie,然后发起连接跳转

拼接的方式是:参数名+等号+参数+分号+空格(此处是否一定需要加空格没有深究,仅是按照后台页面上显示的内容进行复刻)

javascript 复制代码
//watercloud_Token,watercloud_Mark,pc_WC-Token为页面获取到的令牌信息。wc_returnurl为后台系统菜单地址
document.cookie = "watercloud_Token=86df42b8-1baa-4e6f-8222-7fa8859e34dd; watercloud_Mark=cf06dad9-3a1c-4c6d-8ccb-4f65aecd20c6; pc_WC-Token=08dddb95-dc77-4fc0-8d83-5bc78a7c8086; wc_returnurl=/NeiWaiQin/Cardreplacement/Index;"
//以新页面打开方式打开链接
window.open("https://yourDomain/NeiWaiQin/Cardreplacement/Index")

执行后将跳转至后台系统指定菜单下,如:

3.弹框方式打开时页面按钮不显示问题

引发该问题的原因在于系统框架脚本中判断按钮是否显示的条件为:

javascript 复制代码
var moduleId = top.$(".layui-tab-title>.layui-this").attr("lay-id");

此时获取到的moduleId值为:

javascript 复制代码
https://yourdomain/Home/Index#/https://yourdomain/virtualdirectory/?watercloud_Token=86df42b8-1baa-4e6f-8222-7fa8859e34dd&watercloud_Mark=cf06dad9-3a1c-4c6d-8ccb-4f65aecd20c6&pc_WC-Token=08dddb95-dc77-4fc0-8d83-5bc78a7c8086

系统菜单中无改内容所以按钮不显示,所以修改判断条件即可

解决方案:修改WaterCloud.Web\wwwroot\js\lay-module\waterCloud\common.js文件中的authorizeButtonNew方法:(增加虚拟路径判断条件,如果获取值中存在虚拟路径内容,则判断为前端项目跳转至后台的情况,将moduleId值设置为location.pathname(当前打开链接地址,从前端项目跳转至后台系统菜单时此处的值为:NeiWaiQin/Workovertime/Index),系统判断如果当前人员有该按钮权限则显示按钮)

javascript 复制代码
//按钮权限(控制js模板,格式必须严格,新)
authorizeButtonNew: function (innerHTML) {
    //行操作权限控制
    var moduleId = top.$(".layui-tab-title>.layui-this").attr("lay-id");
    if (!moduleId || moduleId.indexOf("/qzgtxzgl/") != -1) {//增加虚拟路径判断,如果取不到值或者是大数据链接进入,获取当前pathname
        moduleId = location.pathname;
    }
    var returnhtml = '';
    //没有就全清
    if (!top.clients || !top.clients.authorizeButton) {
        return returnhtml;
    }
    var dataJson = top.clients.authorizeButton[moduleId.split("?")[0]];
    if (innerHTML.indexOf('</button>') > -1) {
        var buttonHumanized = sessionStorage.getItem('watercloudButtonHumanized');
        var tempList = innerHTML.split('</button>');
        for (var i = 0; i < tempList.length; i++) {
            if (tempList[i].indexOf('<button ') > -1) {
                var itemList = tempList[i].split('<button ');
                returnhtml = returnhtml + itemList[0];
                if (itemList[1].indexOf(' authorize') == -1) {
                    returnhtml = returnhtml + '<button ' + itemList[1] + '</button>';
                }
                else if (dataJson != undefined) {
                    $.each(dataJson, function (i) {
                        if (itemList[1].indexOf('id="' + dataJson[i].F_EnCode + '"') > -1) {
                            returnhtml = returnhtml + '<button ' + itemList[1] + '</button>';
                            return false;
                        }
                    });
                }
                if (!!buttonHumanized) {
                    returnhtml = returnhtml.replace('layui-hide','');
                }
                if (itemList.length>2) {
                    returnhtml = returnhtml + itemList[2];
                }
            }
            else {
                returnhtml = returnhtml + tempList[i];
            }
        }
    }
    else if (innerHTML.indexOf('</a>') > -1){
        var tempList = innerHTML.split('</a>');
        for (var i = 0; i < tempList.length; i++) {
            if (tempList[i].indexOf('<a ') > -1) {
                var itemList = tempList[i].split('<a ');
                returnhtml = returnhtml + itemList[0];
                if (itemList[1].indexOf(' authorize') == -1) {
                    returnhtml = returnhtml + '<a ' + itemList[1] + '</a>';
                }
                else if (dataJson != undefined) {
                    $.each(dataJson, function (i) {
                        if (itemList[1].indexOf('id="' + dataJson[i].F_EnCode + '"') > -1) {
                            returnhtml = returnhtml + '<a ' + itemList[1] + '</a>';
                            return false;
                        }
                    });
                }
                if (itemList.length > 2) {
                    returnhtml = returnhtml + itemList[2];
                }
            }
            else {
                returnhtml = returnhtml + tempList[i];
            }
        }
    }
    //去除隐藏
    //returnhtml = returnhtml.replace(/ layui-hide/g, '');
    return returnhtml;
},