免登录成功后跳回打开的页面

一个H5微应用IT资产系统。以钉钉免登录,只有企业在职人员使用。
应用有2个入口, 查询入口asset/s与扫码入口a/q。
一个为查询入口,让用户输入资产编号可以查看到资产信息与状态等,另一个是扫码粘贴在IT资产实物上的QR 或者Data Martix码可查看资产信息与状态入口。
开发初期,钉钉验证成功之后,均按路由跑。
2026-09-18_16-32-56


这样会引起另一个问题,用户扫码查询资产时,钉钉验证成功之后,手机会导向Assets/S页面,而不是导向资产信息页面。
再扫一次,才会导向正确页面。因为验证信息缓存了。
是否可以在第一次扫码时就导向正确页面?

打开以前随笔《钉钉(DingTalk)免登录https://www.cnblogs.com/insus/p/19036725

想想......

在DingDing model中,添加一个属性 ,
2026-09-18_16-55-01

 

在DingTalk控制器的Logining的Action中,修改为其添加参数,
2026-09-18_16-59-38

 

接下来,修改视图,
2026-09-18_17-13-59

 

添加的代码位于#47和#90,其后有注释。#90把转跳地址一起上传,验证成功能就转跳。
上截图中,#86行代码,
再回过头来看看DingTalk控制器的LoginByDingTalk()之Action。
2026-09-18_17-23-11


钉钉验证成功后,实现转跳。

上截图中,

HttpContext.Session.Remove("ReturnUrl");

这个Session需要移除,因为成功了。
但需要的是需要知道它是在那里设置的。

在过滤器中,也就是说,修改过滤器,
2026-09-18_17-34-47

 

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);
        }
    }
}
View Code


代码分析,

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个入口,或项目其它入口,均无需修改代码,保持原有的。

到此,程序算修改完成了。
用户从哪个入口开始,登录验证成功后,转跳回那个入口。

  

posted @ 2026-09-19 06:31  Insus.NET  阅读(6)  评论(0)    收藏  举报