免登录成功后跳回打开的页面
一个H5微应用IT资产系统。以钉钉免登录,只有企业在职人员使用。
应用有2个入口, 查询入口asset/s与扫码入口a/q。
一个为查询入口,让用户输入资产编号可以查看到资产信息与状态等,另一个是扫码粘贴在IT资产实物上的QR 或者Data Martix码可查看资产信息与状态入口。
开发初期,钉钉验证成功之后,均按路由跑。
这样会引起另一个问题,用户扫码查询资产时,钉钉验证成功之后,手机会导向Assets/S页面,而不是导向资产信息页面。
再扫一次,才会导向正确页面。因为验证信息缓存了。
是否可以在第一次扫码时就导向正确页面?
打开以前随笔《钉钉(DingTalk)免登录》https://www.cnblogs.com/insus/p/19036725
想想......
在DingTalk控制器的Logining的Action中,修改为其添加参数,
添加的代码位于#47和#90,其后有注释。#90把转跳地址一起上传,验证成功能就转跳。
上截图中,#86行代码,
再回过头来看看DingTalk控制器的LoginByDingTalk()之Action。
钉钉验证成功后,实现转跳。
上截图中,
HttpContext.Session.Remove("ReturnUrl");
这个Session需要移除,因为成功了。
但需要的是需要知道它是在那里设置的。
在过滤器中,也就是说,修改过滤器,
namespace Insus.NET.Filters { public class CheckIsLogined : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Session["UserInfo"] == null) { var request = filterContext.HttpContext.Request; string returnUrl = request.Url != null ? request.Url.PathAndQuery : "/Assets/S"; filterContext.HttpContext.Session["ReturnUrl"] = returnUrl; string loginUrl = Util.BaseUrl + "/DingTalk/Logining?returnUrl=" + Uri.EscapeDataString(returnUrl); filterContext.Result = new RedirectResult(loginUrl); } base.OnActionExecuting(filterContext); } } }
代码分析,
request.Url.PathAndQuery
获取用问号(?)分隔的 AbsolutePath 和 Query 属性。
更多参考:https://learn.microsoft.com/zh-cn/dotnet/api/system.uri.pathandquery?view=net-10.0
请求的request.Url是否为空,空,走默认路由,非空,走request.Url.PathAndQuery。
关把returnUrl存入Session中。
回顾整个过滤器,与旧版本的钉钉验证过滤变动很大。
以前验证成功,直接在过滤器中转跳了。
并且修改在旧版过滤器中使用
filterContext.HttpContext.Response.Redirect(...)
引发异常问题,虽然转跳了,但它并未拦截。代码流程(其它Action Filter)还是照跑到完。更改为,
filterContext.Result = new RedirectResult(loginUrl);
2个入口,或项目其它入口,均无需修改代码,保持原有的。
到此,程序算修改完成了。
用户从哪个入口开始,登录验证成功后,转跳回那个入口。



浙公网安备 33010602011771号